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

当我们运行一个没有指定排序顺序的Mongo find()查询时,数据库在内部使用什么来排序结果?

根据mongo网站上的文档 :

在不带参数的情况下执行find()时,数据库以自然顺序返回对象。

对于标准表格,自然顺序并不是特别有用,因为虽然顺序通常接近插入顺序,但不能保证顺序。 但是,对于Capped Collections,自然顺序保证是插入顺序。 这可能是非常有用的。

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

编辑:

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

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

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

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

我已经在临时数据库上运行了一些测试,并且我得到的结果对于所有这三种情况都是一样的( 是的 ) – 但是我想确定,而且我确定我的测试用例不是很彻底。

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

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

  • 如果文件被更新并且不适合他们当前分配的空间,它们将被移动
  • 可以在由删除或移动的文档创建的可用空白中插入新文档

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

如果你想要一个特定的订单,那么你必须包括你的查询排序。

上限集合的自然顺序注释的例外是因为文档不能移动并以插入顺序存储。 排序是封顶收集功能的一部分,可确保最早的文档“超龄”。 此外,文档不能删除或移动到上限集合中(有关更多信息,请参阅用法和限制 )。

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