ObjectId
ObjectId类型很小,几乎是唯一的,能快速生成和排序。ObjectId值由12个字节组成,前4个字节是反应ObjectId创建的时间戳,特别地:
4字节的值表示从Unix纪元开始的秒数
3个字节的机器标识符
2个字节的进程id
3个字节的计数器,以一个随机值开始
MongoDB中,每个保存在集合中的文档都需要一个唯一的_id字段作为主键。如果插入的文档没有_id字段,MongoDB驱动自动为_id字段生成一个ObjectId。
通过带upsert:true选项的更新操作所插入的文档也会自动生成_id字段。
MongoDB客户端应该用唯一的ObjectId添加_id字段。把ObjectId作为_id字段有如下额外的好处:
在mongoshell中,使用ObjectId.getTimestamp()方法可以获取到ObjectId的创建时间
对一个存储ObjectId值的_id字段排序几乎等价于对创建时间排序
重要:
在1秒的时间内,ObjectId值与生成时间的没有严格的顺序,如果多个系统,或者一个系统的多个进程/线程在1秒内生成ObjectId的话。ObjectId不代表严格的插入顺序。由于客户端驱动生成ObjectId值,客户端之间的时钟偏离也会导致非严格的顺序。