首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB _id (ObjectId)是否按升序生成?

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

Stack Overflow用户
提问于 2015-06-26 02:17:01
回答 3查看 11.3K关注 0票数 26

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-26 02:20:19

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

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

来自latest docs的

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

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

票数 31
EN

Stack Overflow用户

发布于 2015-06-26 02:21:59

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

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

票数 6
EN

Stack Overflow用户

发布于 2018-12-11 21:48:48

对于mongo version >= 3.4,Objectid的生成稍有不同。它的结构是:

  • 是一个4字节的值,表示从Unix纪元开始的秒数;
  • 是一个5字节的随机值;
  • 是一个3字节的计数器,从随机值开始。

因此,前4个字节仍然是Unix时代以来的秒数,它仍然几乎是递增的,但并不严格。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31057827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档