MongoDB中的集合ID长度

时间:2014-08-18 04:06:12

标签: mongodb mongoid mongodb-.net-driver mongodb-query

我是mongodb和堆栈溢出的新手。

我想知道为什么mongodb集合ID是24个十六进制字符? 这有什么重要意义?

2 个答案:

答案 0 :(得分:14)

为什么默认_id是一个24个字符的十六进制字符串?

作为MongoDB文档的主键(_id)生成的默认唯一标识符是ObjectId。这是一个12字节的二进制值,通常表示为24个字符的十六进制字符串,以及MongoDB BSON specification支持的标准字段类型之一。

ObjectId的12个字节使用:

构造
  • 一个4字节的值,表示自Unix纪元以来的秒数
  • 一个3字节的机器标识符
  • 一个2字节的进程ID
  • 3字节计数器(以随机值开头)

ObjectId的重要性是什么?

ObjectIds(或根据GUID公式生成的类似标识符)允许在分布式系统中独立生成唯一标识符。

当您扩展到多个应用程序服务器(或sharded cluster中的多个数据库节点)时,独立生成唯一ID的能力变得非常重要。您不希望像序列计数器那样存在中央协调瓶颈(例如,您可能拥有自动递增主键),并且您将希望插入新文档而不存在新标识符将成为一个新标识符的风险重复。

ObjectId通常由MongoDB client driver生成,但如果您的客户端驱动程序或应用程序代码或尚未添加_id字段,也可以在MongoDB服务器上生成。 / p>

我是否必须使用默认的ObjectId?

没有。如果您有更合适的唯一标识符,则可以始终为_id提供自己的值。这可以是单个值,也可以是使用多个字段的复合值。

_id值的主要限制是它们必须对于集合是唯一的,并且您无法更新或删除现有文档的_id

答案 1 :(得分:1)

现在 mongoDB 当前版本是 4.2。 ObjectId 大小仍然是 12 字节,但由 3 部分组成。

<块引用>

ObjectIds 很小,可能是唯一的,生成速度快,而且有序。 ObjectId 值的长度为 12 个字节,包括:

  • 一个 4 字节的时间戳值,代表 ObjectId 的创建,以 Unix 纪元以来的秒数为单位

  • 一个 5 字节的随机值

  • 一个 3 字节递增计数器,初始化为随机值

创建 ObjectId 并从中获取时间戳

> x = ObjectId()
ObjectId("5fdedb7c25ab1352eef88f60")
> x.getTimestamp()
ISODate("2020-12-20T05:05:00Z")

参考

Read MongoDB official doc