当我们运行没有指定任何排序顺序的Mongo find()查询时,数据库内部使用什么来对结果进行排序?
根据documentation on the mongo website:
执行不带参数的find()时,数据库返回 向前自然顺序的对象。
对于标准表,自然顺序不是特别有用,因为, 虽然订单通常接近订单,但事实并非如此 保证是。但是,对于封顶集合,自然顺序是 保证是插入订单。这非常有用。
但是对于标准集合(非上限集合),使用哪个字段对结果进行排序? 它是 _id 字段还是别的什么?
修改:
基本上,我想我想要的是,如果我执行以下搜索查询:
db.collection.find({"x":y}).skip(10000).limit(1000);
在两个不同的时间点: t1 和 t2 ,我会得到不同的结果集:
我在临时数据库上运行了一些测试,我得到的结果与所有3个案例的结果相同(是) - 但我想确定并且我确定我的测试案件不是很彻底。
答案 0 :(得分:91)
根据定义,排序默认为未定义,文档的返回顺序也是如此。如果没有查询,那么它将使用natural order。结果以找到它们的顺序返回,这可能与插入顺序(但不保证是这样)或所使用的索引的顺序一致。
一些会影响存储(自然)顺序的示例:
如果使用索引,将按找到的顺序返回文档。如果使用多个索引,那么订单内部取决于在重复数据删除过程中哪个索引首先识别文档。
如果您想要特定订单,则必须对您的查询进行排序。
capped collections' natural order注意到的例外情况是因为文档无法移动并按插入顺序存储。订购是上限收集功能的一部分,可确保最早的文档首先“老化”。此外,无法删除文件或在带帽的集合中移动文档(有关详细信息,请参阅Usage and Restrictions)。
答案 1 :(得分:6)
以存储的顺序(文件中的顺序)返回,但不保证它们处于插入的顺序中。它们不按_id字段排序。有时它可能看起来像按插入顺序排序,但它可以在另一个请求中更改。这不可靠。