MongoDB的_id(ObjectId)是否按升序生成?
MongoDB的_id(ObjectId)是否按升序生成?
我知道_id列包含了文档插入到集合中的时间戳表示。这里有一个在线工具可以将其转换为时间戳:http://steveridout.github.io/mongo-object-time/
我想知道的是对象ID字符串本身是否保证维持升序?也就是说,这个比较是否总是返回true?
"最新的对象ID" > "次新的对象ID"
MongoDB的_id(ObjectId)在3.4版本以上发生了一些变化。它的结构如下:
- 4个字节的值代表自Unix纪元以来的秒数
- 5个字节的随机值
- 3个字节的计数器,以随机值开始
因此,前4个字节仍然表示自Unix纪元以来的秒数,它仍然几乎是递增的,但不是严格递增的。
问题的原因是MongoDB在3.4版本以上对ObjectId的生成方式进行了调整,导致其不再严格按照递增顺序生成。解决方法是使用其他方式来保证ObjectId的递增顺序,例如在应用程序中自行生成递增的数字,并将其作为ObjectId的一部分。
参考链接:https://docs.mongodb.com/manual/reference/bson-types/#objectid
不,没有任何保证。根据官方文档(原始回答时的文档):
ObjectId值与生成时间的关系在同一秒内不是严格的。如果多个系统、多个进程或同一系统上的多个线程在同一秒内生成值,则ObjectId值不代表严格的插入顺序。客户端之间的时钟偏差也会导致值的非严格排序,因为客户端驱动程序生成ObjectId值,而不是mongod进程。
并且根据最新文档:
虽然ObjectId值应该随时间增长,但它们不一定是单调的。这是因为它们:
- 只包含一秒的时间分辨率,所以在同一秒内创建的ObjectId值没有保证的排序。
- 由客户端生成,客户端可能具有不同的系统时钟。
所以,结论是在更大的时间范围内是按升序排列的,但在小于一秒的时间范围内不是严格有序的。需要注意的是,在最坏的情况下,“更大的时间范围”可以非常宽广。考虑这样一种情况,当您插入一个文档时,将系统时钟设置为1970年1月1日,然后再插入另一个文档。
所以...如果ObjectId是在一台机器上生成的,那么我可以假设它们是按顺序排列的吗?
请注意,以上是根据官方文档的解释得出的结论。