MongoDB 的 ObjectId 是一个由 MongoDB 自动生成的唯一标识符,用于在集合中唯一标识文档。它是一个12字节的值,由以下几个部分组成:
(1)时间戳(4字节):表示 ObjectId 的生成时间,以 UNIX 时间戳格式存储。
(2)机器标识(3字节):表示生成 ObjectId 的机器的标识符,通常是机器的 MAC 地址的一部分。
(3)进程ID(2字节):表示生成 ObjectId 的进程的标识符。
(4)自增计数器(3字节):表示在同一进程中生成 ObjectId 的计数器,确保在同一秒内生成的 ObjectId 的唯一性。
ObjectId 的格式通常是一个 24 位的十六进制字符串,如:5f7b1b5d2b6c7e8f90123456。
在 MongoDB 中,可以使用 ObjectId 来唯一标识和查询文档。例如,可以使用 _id 字段来查询具有特定 ObjectId 的文档:
> db.col.find({ "_id" : ObjectId("64e71af810366fa87109a12f") }) { "_id" : ObjectId("64e71af810366fa87109a12f"), "name" : "张三", "age" : 3, "email" : "zhangsan@outlook.com", "sex" : "male" }
此查询将返回具有指定 ObjectId 的文档。
可以使用 ObjectId() 函数来生成一个新的 ObjectId。使用以下代码生成新的ObjectId:
> var newObjId = new ObjectId(); > newObjId ObjectId("64f67bd4e851871a0dba078c")
上面的语句返回以下唯一生成的 id:
ObjectId("64f67bd4e851871a0dba078c")
你也可以使用生成的 id 来取代 MongoDB 自动生成的 ObjectId:
> ObjectId("64f67bd4e851871a0dba078c") ObjectId("64f67bd4e851871a0dba078c")
由于 ObjectId 中存储了 4 个字节的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp() 函数来获取文档的创建时间:
> ObjectId().getTimestamp() ISODate("2023-09-05T00:55:28Z")
以上代码将返回 ISO 格式的文档创建时间:
ISODate("2023-09-05T00:55:28Z")
在某些情况下,您可能需要将 ObjectId 转换为字符串格式。你可以使用下面的代码:
> new ObjectId().str 64f67cb9e851871a0dba078e
以上代码将返回 Guid 格式的字符串为 64f67cb9e851871a0dba078e