当前位置: 首页 > 知识库问答 >
问题:

mongodb在_id上的排序顺序

林威
2023-03-14

我想知道mongoDB如何比较"_id"字段时做如下查询:

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

是否纯粹基于id的时间戳部分?

共有3个答案

危卜鹰
2023-03-14

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

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

端木震博
2023-03-14

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

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

龙嘉誉
2023-03-14

稍微扩展一下安德烈所说的:

由于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-B单目标规范

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

 类似资料:
  • 我想在Firebase数据库上从上到下排序。有人能帮帮我吗?我试图使用集合,但不起作用。 启动回收者视图的活动 MyClass用户

  • 我的数据库中有一些虚拟数据。我试图执行mongodb聚合函数,以便根据给定的标题进行排序 到目前为止,我能够提出的查询是这个,下面是mongodb返回的内容。 db。测验聚合([{$unwind:“$fields”},{$match:{“fields.title”:“firstName”},{$sort:{“fields.value”:1}}}]) 但是,返回的数据集的结果应该包括字段列表中的其他

  • 问题内容: 我正在尝试通过sequelize从数据库中输出所有对象列表,如下所示,并希望在我在where子句中添加id时对数据进行整理。 但是问题是渲染后,所有数据按如下进行整理。 正如我发现的那样,它既没有按ID也没有按名称排序。请帮我解决。 问题答案: 在序列化中,您可以轻松添加order by子句。 看看我如何添加对象数组? 编辑: 一旦在诺言中收到对象,您可能必须订购这些对象。查看有关根据

  • 要在 MongoDB 中对查询到的文档进行排序,您可以使用 sort() 方法,该方法的语法格式如下: db.collection_name.find().sort({key:1}) 其中 key 用来定义要根据那个字段进行排序,后面的值 1 则表示以升序进行排序,若要以降序进行排序则需要将其设置为 -1。 【示例】假设集合“course”中有如下数据: 若要将集合中的数据按照 title 字段降

  • 我正试图通过单个字段对一个包含数百万行的集合进行完全排序。据我所知,ObjectId包含4个字节的时间戳。我的时间戳是4字节整数索引字段。所以我认为sort by _id和timestamp应该是相似的,但是下面是结果 和 为什么会发生这种情况,这里有优化的方法吗?谢谢 更新 正如我指出的,我试图排序的时间戳字段已经被索引 馆藏统计 我致力于mongob进程4gb的ram(试图增加到8gb,但速度

  • 当我们运行一个Mongo find()查询而没有指定任何排序顺序时,数据库内部使用什么对结果进行排序? 根据mongo网站上的文件: 在不带参数的情况下执行find()时,数据库将按前向自然顺序返回对象。 当t1和T2之间没有其他写操作时? 当t1和T2之间有新的写操作时? 在t1和T2之间添加了新索引? 我在一个临时数据库上运行了一些测试,我得到的结果是相同的(是的)所有3个案例--但我想确定,