MongoDB之ObjectId的时间范围查询

Mongodb的ObjectId是如何生成的?

   mongodb对于未定义_id的数据,会自动生成ObjectId;它的规则是有16进制时间戳(4个字节,即8个字符)+5字节的随机值+3字节的计数器(以随机值开始)组成;详情可以见官网对于ObjectId的描述及其操作:官网对于ObjectId的描述及其操作

本节主要解决问题是如何通过指定时间来对于ObjectId进行过滤数据:

    1.获取指定时间的时间戳(精确到秒)

    2.把10位的时间戳转成16进制字符,得到4个字节

    3.对4个字节(时间戳)后追加"0000000000000000"(8个字节)

那么就按照上述步骤进行代码展示(以python为例):

def query():
    client = mongodbInit.MongodbData("LOCAL_MONGODB"); #获取mongo连接
    t = time.strptime("2019-07-31 00:00:00", "%Y-%m-%d %H:%M:%S" );
    k = time.mktime(t);
    stamp10 = int(k)  # 10位的时间戳
    stamp16 = hex(int(stamp10))[2:];  # 转16进制(这里偏移2位,由于python会把16进制0x带上,要移除)
    queryConditon = {"_id": {"$gte":ObjectId(stamp16 + "0000000000000000")}};
    t = client.db["collect"].find(queryConditon);
    for a in t:
        time.sleep(1)
        print "objectId=%s;idTime=%s" %(a["_id"],a["_id"].generation_time);
    client.close();

运行结果:

objectId=5d40da14cd7eb30000eba987;idTime=2019-07-31 00:00:20+00:00
objectId=5d40da31f76e5e0000fc0ab7;idTime=2019-07-31 00:00:49+00:00
objectId=5d40da323c2a7c0000a3914e;idTime=2019-07-31 00:00:50+00:00
objectId=5d40da323c2a7c0000a39168;idTime=2019-07-31 00:00:50+00:00
objectId=5d40da323c2a7c0000a39169;idTime=2019-07-31 00:00:50+00:00
objectId=5d40da323c2a7c0000a3916a;idTime=2019-07-31 00:00:50+00:00

 注意:MongoDB默认的是UTC时间(协调世界时间),刚好比当前区时晚了8个小时;如果查询发现慢了8个小时是由于时区不统一的问题;

童鞋们,如果有什么问题?请及时留言哦!

你可能感兴趣的:(mongdb)