_id上的mongodb排序顺序

问题描述 投票:52回答:3

我想知道mongodb在执行查询时如何比较“_id”字段,如下所示:

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

它纯粹基于id的时间戳部分吗?

mongodb
3个回答
41
投票

稍微扩大Andre所说的内容:

由于ObjectID时间戳仅为第二个,因此可以使用相同的时间戳值(前4个字节)轻松创建两个(或更多)ObjectID。如果这些是在同一台机器上创建的(机器ID - 接下来的3个字节),通过相同的进程(PID - 接下来的2个字节),那么区分它们的唯一方法就是“inc”字段,最后3个字节在末尾。

请参阅此处查看完整规格:

https://docs.mongodb.com/manual/reference/method/ObjectId/#ObjectIDs-BSONObjectIDSpecification

假设规范正确实施,那个“inc”字段要么是一个不断增加的字段(然后你可以合理地期望排序在插入/创建顺序中)或随机值(然后可能是唯一的,但不是有序的) 。请注意,ObjectID可以由驱动程序或应用程序(或实际上是手动)而不是MongoDB本身生成,因此除非您完全控制它们的生成方式,否则上述任何或所有可能都适用。


26
投票

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

你可以在documentation找到更多细节


12
投票

从Mongo specs https://docs.mongodb.com/manual/reference/bson-types/#objectid复制粘贴

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

© www.soinside.com 2019 - 2024. All rights reserved.