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

sau*_*bhj 89 mongodb

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

根据mongo网站上文档:

执行不带参数的find()时,数据库以正向自然顺序返回对象.

对于标准表,自然顺序不是特别有用,因为尽管订单通常接近于订单,但不能保证.但是,对于Capped Collections,自然顺序保证为插入顺序.这非常有用.

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

编辑:

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

db.collection.find({"x":y}).skip(10000).limit(1000);
Run Code Online (Sandbox Code Playgroud)

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

  1. 当t1和t2之间没有额外的写入时?
  2. 当t1和t2之间有新的写入时?
  3. 在t1和t2之间添加了新的索引?

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

Ste*_*nie 97

根据定义,排序默认为undefined,文档的返回顺序也是如此.如果没有查询,那么它将使用自然顺序.结果按照它们被找到顺序返回,这可能与插入顺序(但不保证是这样)或所使用的索引的顺序一致.

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

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

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

如果您需要特定订单,必须在查询中包含排序.

对于上限集合的自然顺序而言,例外情况是因为文档无法移动并按插入顺序存储.订购是上限收集功能的一部分,可确保最早的文档首先"老化".此外,无法在封顶集合中删除或移动文档(有关详细信息,请参阅使用和限制).

  • @saurabhj:添加了一些会影响自然顺序的例子.如果文件已被移动/删除,您可能会得到不同的结果集.如果没有文档插入/更新/删除,您应该得到相同的结果.添加索引不会影响磁盘上文档的位置. (5认同)
  • 还应该添加警告,如果您使用[复制](http://www.mongodb.org/display/DOCS/Replication),自然顺序可能因副本集成员而异. (5认同)
  • 这是否意味着如果我在两个不同的时间点运行相同的find命令:db.collection.find({"x":y}).skip(20000).limit(1000),我会得到不同的结果套?如果两个命令之间没有写入会发生什么? (3认同)

Par*_*ade 6

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