_id上的mongodb排序顺序

Sam*_*Sam 59 mongodb

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

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

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

Ada*_*ord 45

稍微扩大Andre所说的内容:

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

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

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

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

  • 由于它是由app生成的,从技术上讲(这里是纯粹的),它永远不会按插入排序,而是在驱动程序将_id应用于文档时. (3认同)
  • 由于我们注意到技术性,因此应用程序会生成_id,如果是,或者驱动程序(或您)指定客户端.如果在插入时没有_id作为文档的一部分传递,则_id由服务器生成,因此驱动程序将其应用于文档时并不总是如此. (3认同)

And*_*ere 26

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

您可以在文档中找到更多详细信息


and*_*yro 13

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

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