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的唯一性。
通过上面的分析,我们可以用这种方法
- function objectIdWithTimestamp(timestamp)
- {
- //把时间字符串转换成标准的时间格式
- if (typeof(timestamp) == 'string') {
- timestamp = new Date(timestamp);
- }
- // 把时间转成16进制数
- hexSeconds = Math.floor(timestamp/1000).toString(16);
- // 通过16进制的秒数创建objectId
- constructedObjectId = ObjectId(hexSeconds + "0000000000000000");
- return constructedObjectId
- }
- db.mycollection.find({ _id: { $gt:objectIdWithTimestamp('1986/05/10') } });//只能查找出一个时间区间的记录哦
- mongodb每条记录中的ObjectId组成结构
- Mongodb中的ObjectId浅谈
- MongoDB中ObjectId组成及源码
- MongoDB中的_id和ObjectId
- MongoDB中的_id和ObjectId
- mongodb中的ObjectId类型主键
- MongoDB中的_id和ObjectId
- mongodb ObjectId
- java查询mongodb中的objectid示例
- 统计每条记录中的最大连续值
- oracle查询:取出每组中的第一条记录
- oracle相关:如何取出每组中的第一条记录
- oracle查询:取出每组中的第一条记录
- oracle查询:取出每组中的第一条记录
- Sqlserver 获取每组中的第一条记录
- oracle取出每组中的第一条记录
- 如何使gridView中的每条记录分两行显示
- oracle查询:取出每组中的第一条记录
- ie6注释造成文字“重影”分析。双文字
- win32 API函数大全
- 问题解决力
- Nginx 相关资料
- VC++如何以创建日期命名文本文档
- mongodb每条记录中的ObjectId组成结构
- c和c++变量的存储
- Oracle 获取当前日期及日期格式
- C#多线程编程
- SQL中的Order By
- poj 2723 Get Luffy Out(2-sat构图题)
- hdu3718Similarity
- 类似查询mysql数据库的查询XML的JS类
- oracle都有哪些系统表,分别是做什么用的