MongoDB中的集合ID长度

MongoDB中的集合ID长度,mongodb,mongoid,mongodb-.net-driver,mongodb-query,Mongodb,Mongoid,Mongodb .net Driver,Mongodb Query,我不熟悉mongodb和堆栈溢出 我想知道为什么mongodb集合ID是24个十六进制字符? 这有什么重要性?为什么默认的\u id是24个字符的十六进制字符串? 作为MongoDB文档的主键(\u id)生成的默认唯一标识符是。这是一个12字节的二进制值,通常表示为24个字符的十六进制字符串,是MongoDB支持的标准字段类型之一 ObjectId的12个字节由以下内容构成: 一个4字节的值,表示自Unix纪元以来的秒数 3字节的机器标识符 一个2字节的进程id 3字节计数器(以随机值开始)

我不熟悉mongodb和堆栈溢出

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

为什么默认的
\u id
是24个字符的十六进制字符串?
作为MongoDB文档的主键(
\u id
)生成的默认唯一标识符是。这是一个12字节的二进制值,通常表示为24个字符的十六进制字符串,是MongoDB支持的标准字段类型之一

ObjectId的12个字节由以下内容构成:

  • 一个4字节的值,表示自Unix纪元以来的秒数
  • 3字节的机器标识符
  • 一个2字节的进程id
  • 3字节计数器(以随机值开始)
ObjectId的重要性是什么? ObjectID(或根据公式生成的类似标识符)允许在分布式系统中独立生成唯一标识符

当您扩展到多个应用程序服务器(或者一个应用程序中的多个数据库节点)时,独立生成唯一ID的能力变得非常重要。您不希望有一个像序列计数器这样的中心协调瓶颈(例如,对于自动递增主键,您可能会遇到这种瓶颈),并且您希望插入新文档,而不会有新标识符被证明是重复的风险

ObjectId通常由您的MongoDB生成,但如果您的客户端驱动程序或应用程序代码或尚未添加
\u id
字段,也可以在MongoDB服务器上生成ObjectId

我必须使用默认的ObjectId吗? 不可以。如果您有更合适的唯一标识符可供使用,则始终可以为
\u id
提供您自己的值。这可以是单个值,也可以是使用多个字段的复合值


\u id
值的主要限制是,它们对于集合必须是唯一的,并且不能更新或删除现有文档的
\u id
。现在mongoDB当前版本是4.2。ObjectId大小仍为12字节,但由3部分组成

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

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

  • 5字节的随机值

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

创建ObjectId并从中获取时间戳

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


官方文档是一个很好的起点:为主键(
\u id
)生成的默认唯一标识符是一个。这是一个12字节的二进制值,通常表示为24个字符的十六进制字符串。如果有更合适的唯一标识符可供使用,则可以为
\u id
提供自己的值。ObjectId的重要性在于可以在分布式系统中生成唯一的值(通常由客户机驱动程序生成)。这与类似,但更紧凑。4字节值是无符号的吗?如果不是这样,MongoDB将在大约22年后进行彻底检修…@KennyWorden ObjectId目前使用有符号的32位int(即),因此时间组件最终将滚动(另请参阅:)。生成的objectid应该在滚动后的一段时间内保持唯一(按字节),但某些假设(如按单调递增的时间前缀排序)将不再成立。我假设在此之前会引入一个替代的ObjectId子类型:)。我相信unixtime组件最初是为了唯一性和对生成的ObjectId进行粗略排序,而不是在默认的
\u id
s中嵌入时间戳(当然,开发人员从那时起就对时间戳方面进行了假设)。已经有几个ObjectId变体,由不同的遗留驱动程序实现(参见BSON规范中的或中所述)。签名?为什么?他们不需要在大纪元之前追踪时间@KennyWorden还请参见::“Unix时间是一个每秒递增的单符号整数”。我认为,对于Unix内核开发人员来说,“当时似乎是个好主意”(类似于选择1970年1月1日作为Unix时代)。为了方便起见,ObjectId生成中的用法遵循既定惯例。整个ObjectId希望被唯一地生成,但正如前面提到的,我认为它不一定要嵌入时间戳。您还可以自由地为
\u id
使用自己的唯一标识符,而不是默认的ObjectId。