官方文档:https://docs.mongodb.com/manual/reference/method/ObjectId/index.html
概述
创建新的ObjectId
获取文档的时间戳
ObjectId十六进制字符串表示形式
> db.col.find() { "_id" : ObjectId("56c56dd4ca446fab71e4c38a"), "x" : 1, "y" : 3 } { "_id" : ObjectId("56c572c2ca446fab71e4c38b"), "x" : 2, "y" : 2 } { "_id" : ObjectId("56c572c8ca446fab71e4c38c"), "x" : 3, "y" : 1 } { "_id" : ObjectId("56c5a7beb708aa3d13c61cc7"), "c" : 3, "m" : 1 }
每个文档中都有一个“_id”,她是一个12字节的BSON类型数据,格式如下
56c56dd4ca446fab71e4c38a
前4个字节表示时间戳
接下来的3个字节是机器标识码
紧接的两个字节由进程id组成(PID)
最后三个字节是随机数
ObjectId使用12字节的存储空间,其生成方式如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
时间戳 | 机器ID | PID | 计数器 |
MongoDB存储的文档必须有一个的“_id”键,这个键值可以是任意类型,默认的是ObjectId类型对象。
文档的“_id”是唯一的,以确保集合中的文档被唯一标识。
MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个服务器上同步自动增加主键值既费力还费时。(不同机器可以通过机器名区分,同一个机器通过时间戳、随机数、进程id区分)
创建新的ObjectId
> newObjectId_1 = ObjectId() ObjectId("56c686d264799370c0ef357b") > newObjectId_2 = ObjectId() ObjectId("56c686d364799370c0ef357c")
可以用已经生成的id取代自动生成的ObjectId
d = ObjectId("56c686d364799370c0ef357c") ObjectId("56c686d364799370c0ef357c")
获取文档的时间戳
由于ObjectId的前4位是时间戳,因此不需要为文档特意的保存时间戳,可以用getTimestamp()获取
> ObjectId("56c56dd4ca446fab71e4c38a").getTimestamp() ISODate("2016-02-18T07:08:04Z")
ObjectId返回对象的十六进制字符串表示形式
> new ObjectId().str 56c68c3b64799370c0ef3581 > ObjectId("56c56dd4ca446fab71e4c38a").str 56c56dd4ca446fab71e4c38a
使用默认_id进行排序
如果使用了默认的ObjectId作为_id值,而你又希望通过insert的时间进行排序查询,那么一切就简单了,你可以直接使用_id字段进行排序,因为它本身是按insert的时间自增生成的。
> // 获取最新加入的10条记录 > db.mycollection.find().sort({id:-1}).limit(10);