版权声明:本文为博主原创文章,无需授权即可转载,甚至无需保留以上版权声明,转载时请务必注明作者。
https://blog.csdn.net/weixin_43453386/article/details/84951911
MongoDB——》ObjectId
一、ObjectId简介
MySQL等关系型数据库,主键都是设置成自增的。
在分布式环境下,自增主键,会产生冲突。
为此,mongodb采用了一个称之为ObjectId的类型来做主键。
ObjectId:12字节,16进制 ,BSON 类型字符串
字节位置 | 说明 |
---|---|
4字节 | 文档创建时间:UNIX时间戳 ,单位秒 |
3字节 | 主机唯一标识符:机器主机名的散列值(hash值,同一台机器的hash值一致) |
2字节 | 进程标识符:同一台机器不同的mongodb进程产生的ObjectId不冲突 |
3字节 | 由一个随机数开始的计数器生成的值 |
二、从ObjectId中获取时间
1.构造ObjectId
- 执行命令
a = new ObjectId();
- 返回结果
ObjectId("5c0f21fe4f644bd639fbbde7")
2.获取时间
- 执行命令
a.getTimestamp();
或者ObjectId("5c0f21fe4f644bd639fbbde7").getTimestamp();
- 返回结果
ISODate("2018-12-11T02:35:10Z")
三、根据时间构造ObjectId
整个过程如下:
1.获取时间
使用Date的字符串构造方法生成日期,
然后使用Date对象的getTime获取毫秒数,
再除以1000得到标准时间戳
- 执行命令
a = new Date("2018-12-11T02:35:10Z").getTime()/1000
- 返回结果
1544495710
2.时间转为16进制字符
- 执行命令
a = a.toString(16)
- 返回结果
5c0f225e
3.格式化16进制字符
- 执行命令
a = a + new Array(17).join("0")
- 返回结果
5c0f225e0000000000000000
4.字符串构造ObjectId
- 执行命令
b = new ObjectId(a)
- 返回结果
ObjectId("5c0f225e0000000000000000")
5.验证ObjectId中的时间
- 执行命令
b.getTimestamp()
- 返回结果
ISODate("2018-12-11T02:35:10Z")