mongodb每条记录中的ObjectId组成结构

来源:互联网 发布:织梦cms漏洞利用工具 编辑:程序博客网 时间:2024/06/05 17:28

ObjectId 由4部分组成
点击查看原始尺寸
比如有这样一个ObjectId=>4e7020cb7cac81af7136236b
1) Time
时间戳。objectid的前4位进行提取“4e7020cb”,然后按照十六进制转为十进制,变为“1315971275”,这个数字就是一个时间戳。
2) Machine
机器。接下来的三个字节就是“7cac81”,这三个字节是所在主机的唯一标识符,一般是机器主机名的散列值,这样就确保了不同主机生成不同的机器hash值,确保在分布式中不造成冲突,这也就是在同一台机器生成的objectId中间的字符串都是一模一样的原因。
3) PID
进程ID。上面的Machine是为了确保在不同机器产生的objectId不冲突,而pid就是为了在同一台机器不同的mongodb进程产生了objectId不冲突,接下来的“af71”两位就是产生objectId的进程标识符。
4) INC
自增计数器。前面的九个字节是保证了一秒内不同机器不同进程生成objectId不冲突,这后面的三个字节“36236b”是一个自动增加的计数器,用来确保在同一秒内产生的objectId也不会发现冲突,允许256的3次方等于16777216条记录的唯一性。
总的来看,objectId的前4个字节时间戳,记录了文档创建的时间;接下来3个字节代表了所在主机的唯一标识符,确定了不同主机间产生不同的objectId;后2个字节的进程id,决定了在同一台机器下,不同mongodb进程产生不同的objectId;最后通过3个字节的自增计数器,确保同一秒内产生objectId的唯一性。

通过上面的分析,我们可以用这种方法

  
  1. function objectIdWithTimestamp(timestamp)
  2. {
  3. //把时间字符串转换成标准的时间格式
  4. if (typeof(timestamp) == 'string') {
  5. timestamp = new Date(timestamp);
  6. }
  7. // 把时间转成16进制数
  8. hexSeconds = Math.floor(timestamp/1000).toString(16);
  9. // 通过16进制的秒数创建objectId
  10. constructedObjectId = ObjectId(hexSeconds + "0000000000000000");
  11. return constructedObjectId
  12. }
  13. db.mycollection.find({ _id: { $gt:objectIdWithTimestamp('1986/05/10') } });//只能查找出一个时间区间的记录哦
原创粉丝点击