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