_id上的mongodb排序顺序

时间:2012-08-23 19:36:40

标签: mongodb

我想知道mongodb如何比较" _id"执行以下查询时的字段:

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

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

3 个答案:

答案 0 :(得分:42)

稍微扩大安德烈的说法:

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

请参阅此处了解完整规范:

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

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

答案 1 :(得分:26)

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

您可以在documentation

中找到更多详情

答案 2 :(得分:12)

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

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