_ id 上的 mongodb 排序顺序

我想知道在执行以下查询时,mongodb 如何比较“ _ id”字段:

db.data.find({"_id":{$gt:ObjectId("502aa46c0674d23e3cee6152")}}).sort({"_id":1}).limit(10);

它是否完全基于 id 的时间戳部分?

88329 次浏览

在某种程度上,你是正确的,如果你按 _id排序,你将按插入时间排序。这并不意味着只对时间戳部分进行比较。ObjectID 本身是一种 BSON 对象类型,它们可以直接相互比较。由于它们以时间戳开始,从逻辑上讲,过去的时间将少于未来的时间。

你可以在 文件中找到更多的细节

稍微扩展一下安德烈的话:

由于 ObjectID 时间戳只针对第二个 ObjectID,因此可以很容易地为时间戳(前4个字节)创建具有相同值的两个(或更多) ObjectID。如果这些是在同一台机器上创建的(机器 ID-接下来的3个字节) ,通过相同的进程(PID-接下来的2个字节) ,那么唯一能区分它们的就是“ inc”字段,最后的3个字节。

更新: 2020年1月

这个答案仍然很受欢迎,所以值得稍微更新一下。ObjectID 规范是在8年前编写这个答案之后发展起来的,时间戳之后的5个字节现在只是随机的,这将大大降低任何冲突的可能性。最后三个字节仍然是增量的,但是以随机值初始化,同样减少了发生冲突的可能性。ObjectID 现在包含更少的上下文(你不能很容易地说出它是在哪里生成的,是由什么过程生成的) ,但是我猜测这些信息并没有以任何有意义的方式被使用,并且已经被弃用,以便更好地随机化 ID。

最后更新

看这里的完整规格:

Https://docs.mongodb.com/manual/reference/method/objectid/#objectids-bsonobjectidspecification

那个“ inc”字段要么是一个不断递增的字段(那么您可以合理地期望排序按照插入/创建顺序进行) ,要么是一个随机值(然后可能是唯一的,但不是有序的) ,当然前提是规范的实现是正确的。请注意,ObjectID 可能由驱动程序或应用程序(或实际上是手动)生成,而不是由 MongoDB 本身生成,因此除非您完全控制如何生成 ObjectID,否则可能会应用上述任何一种或全部方法。

从 Mongo 规格复制粘贴 Https://docs.mongodb.com/manual/reference/bson-types/#objectid

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