概述

> 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)
  • 最后三个字节是随机数

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