【问题标题】:Is MongoDB _id (ObjectId) generated in an ascending order?MongoDB _id (ObjectId) 是升序生成的吗?
【发布时间】:2015-09-12 12:02:06
【问题描述】:

当文档被插入到集合中时,我知道 _id 列如何包含时间戳的表示。这是一个在线实用程序将其转换为时间戳:http://steveridout.github.io/mongo-object-time/

我想知道的是对象id字符串本身是否保证保持升序?即这种比较是否总是返回true?

"newest object id" > "second newest object id"

【问题讨论】:

  • 等等,您是指插入顺序还是只是 _id 创建顺序?

标签: mongodb objectid


【解决方案1】:

不,没有任何保证。来自official documentation (at the time of the original answer)

ObjectId 值的顺序与生成时间的关系在单秒内并不严格。如果多个系统,或单个系统上的多个进程或线程生成值,在一秒钟内; ObjectId 值不代表严格的插入顺序。客户端之间的时钟偏差也可能导致非严格排序,即使对于值也是如此,因为客户端驱动程序生成 ObjectId 值,而不是 mongod 进程。

来自latest docs

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

仅包含一秒的时间分辨率,因此在同一秒内创建的 ObjectId 值没有保证顺序,并且 由可能具有不同系统时钟的客户端生成。

【讨论】:

  • 感谢您的参考。事实证明,它在更宽的时间范围内按升序排列,但不是按小于一秒的顺序排列。
  • 好吧,我会小心的,在最坏的情况下,“更宽的时间范围”可能真的很宽。考虑插入文档时的场景,将系统时钟设置为 1970 年 1 月 1 日并插入另一个。
  • 所以...如果 ObjectId 是在一台机器上生成的,那么我可以假设它们是按 asc 顺序排列的?
【解决方案2】:

对于mongo version >= 3.4,Objectid 生成稍作更改。 它的结构是:

  • 一个 4 字节的值,表示自 Unix 纪元以来的秒数,
  • 一个 5 字节的随机值,并且
  • 一个 3 字节的计数器,从一个随机值开始。

所以前 4 个字节仍然是自 Unix 纪元以来的秒数,它仍然几乎是递增的,但并不严格。

https://docs.mongodb.com/manual/reference/bson-types/#objectid

【讨论】:

    【解决方案3】:

    _id:ObjectId(4字节时间戳,3字节机器ID,2字节进程ID,3字节增量)

    这是 id 结构。所以只有最后 3 个字节会唯一递增。所以你的问题的答案是肯定的。

    【讨论】:

    • 所以你的答案是部分正确的,但是从上面的答案考虑,它几乎是上升的,但不是严格的,因为时间戳字节具有更高的值并且它可能在小于 1 秒的范围内出现故障.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2023-03-19
    相关资源
    最近更新 更多