MongoDB的_id(ObjectId)是否按升序生成?

22 浏览
0 Comments

MongoDB的_id(ObjectId)是否按升序生成?

我知道_id列包含了文档插入到集合中的时间戳表示。这里有一个在线工具可以将其转换为时间戳:http://steveridout.github.io/mongo-object-time/

我想知道的是对象ID字符串本身是否保证维持升序?也就是说,这个比较是否总是返回true?

"最新的对象ID" > "次新的对象ID"

0
0 Comments

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

0
0 Comments

不,没有任何保证。根据官方文档(原始回答时的文档):

ObjectId值与生成时间的关系在同一秒内不是严格的。如果多个系统、多个进程或同一系统上的多个线程在同一秒内生成值,则ObjectId值不代表严格的插入顺序。客户端之间的时钟偏差也会导致值的非严格排序,因为客户端驱动程序生成ObjectId值,而不是mongod进程。

并且根据最新文档:

虽然ObjectId值应该随时间增长,但它们不一定是单调的。这是因为它们:

- 只包含一秒的时间分辨率,所以在同一秒内创建的ObjectId值没有保证的排序。

- 由客户端生成,客户端可能具有不同的系统时钟。

所以,结论是在更大的时间范围内是按升序排列的,但在小于一秒的时间范围内不是严格有序的。需要注意的是,在最坏的情况下,“更大的时间范围”可以非常宽广。考虑这样一种情况,当您插入一个文档时,将系统时钟设置为1970年1月1日,然后再插入另一个文档。

所以...如果ObjectId是在一台机器上生成的,那么我可以假设它们是按顺序排列的吗?

请注意,以上是根据官方文档的解释得出的结论。

0
0 Comments

MongoDB的_id字段是由ObjectId组成的,它包括4个字节的时间戳(timestamp)、3个字节的机器ID(machine id)、2个字节的进程ID(process id)以及3个字节的递增器(incrementer)。其中,只有最后3个字节会递增,因此可以保证唯一性。

根据上述回答,问题的答案是肯定的,_id字段是按照递增顺序生成的。然而,由于时间戳字节的值较大,在小于1秒的时间范围内可能会出现乱序的情况。

解决方法暂时没有提及。

0