首页 文章

当没有指定排序顺序时,MongoDB如何对记录进行排序?

提问于
浏览
77

当我们在没有指定任何排序顺序的情况下运行Mongo find()查询时,数据库内部使用什么来对结果进行排序?

根据documentation on the mongo website

执行不带参数的find()时,数据库以前向自然顺序返回对象 . 对于标准表,自然顺序不是特别有用,因为尽管订单通常接近于订单,但不能保证 . 但是,对于Capped Collections,自然顺序保证为插入顺序 . 这非常有用 .

但是对于标准集合(非上限集合),使用哪个字段对结果进行排序?是 _id 字段还是别的什么?

Edit:

基本上,我想我想要的是,如果我执行以下搜索查询:

db.collection.find({"x":y}).skip(10000).limit(1000);

在两个不同的时间点: t1t2 ,我会得到不同的结果集:

  • t1和t2之间没有额外的写入?

  • 当t1和t2之间有新的写入时?

  • 在t1和t2之间添加了新索引?

我已经在临时数据库上运行了一些测试,我得到的结果与所有3个案例相同( Yes ) - 但我想确定并且我确信我的测试用例不是很彻底 .

2 回答

  • 84

    根据定义,排序 defaults to undefined ,以及文档的返回顺序 . 如果没有查询,那么它将使用natural order . 结果在 order they are found 中返回,这可能与插入顺序(但不保证是这样)或所使用的索引的顺序一致 .

    一些会影响存储(自然)顺序的示例:

    • 如果文档已更新且不适合当前分配的空间,则会移动它们
      可以在删除或移动的文档创建的可用间隙中插入
    • 个新文档

    如果使用索引,则将按找到的顺序返回文档 . 如果使用多个索引,那么该顺序在内部取决于在重复数据删除过程中哪个索引首先识别文档 .

    如果您 want a specific order 那么您 must 包含您的查询的排序 .

    capped collections' natural order注意到的例外是因为文档无法移动并按插入顺序存储 . 排序是上限集合功能的一部分,可确保最早的文档"age out" . 此外,无法在带帽的集合中删除或移动文档(有关详细信息,请参阅Usage and Restrictions) .

  • 5

    它以存储的顺序(文件中的顺序)返回,但不保证它们处于插入的顺序中 . 它们不按_id字段排序 . 有时它可能看起来像按插入顺序排序,但它可以在另一个请求中更改 . 这不可靠 .

相关问题