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

时间:2012-07-22 09:20:10

标签: mongodb

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

根据documentation on the mongo website

  

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

     

对于标准表,自然顺序不是特别有用,因为,   虽然订单通常接近订单,但事实并非如此   保证是。但是,对于封顶集合,自然顺序是   保证是插入订单。这非常有用。

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

修改:

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

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

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

  1. 当t1&之间没有额外的写入时T2?
  2. 当t1&之间有新的写入时T2?
  3. 在t1和&之间添加了新的索引。 T2?
  4. 我在临时数据库上运行了一些测试,我得到的结果与所有3个案例的结果相同() - 但我想确定并且我确定我的测试案件不是很彻底。

2 个答案:

答案 0 :(得分:91)

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

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

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

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

如果您想要特定订单,则必须对您的查询进行排序。

capped collections' natural order注意到的例外情况是因为文档无法移动并按插入顺序存储。订购是上限收集功能的一部分,可确保最早的文档首先“老化”。此外,无法删除文件或在带帽的集合中移动文档(有关详细信息,请参阅Usage and Restrictions)。

答案 1 :(得分:6)

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