- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我们在没有指定任何排序顺序的情况下运行 Mongo find() 查询时,数据库内部使用什么来对结果进行排序?
根据documentation on the mongo website :
When executing a find() with no parameters, the database returns objects in forward natural order.
For standard tables, natural order is not particularly useful because, although the order is often close to insertion order, it is not guaranteed to be. However, for Capped Collections, natural order is guaranteed to be the insertion order. This can be very useful.
但是对于标准集合(非上限集合),使用什么字段对结果进行排序?是 _id 字段还是其他字段?
编辑:
基本上,我想我想要得到的是,如果我执行以下搜索查询:
db.collection.find({"x":y}).skip(10000).limit(1000);
在两个不同的时间点:t1 和 t2,我会得到不同的结果集吗:
我在临时数据库上运行了一些测试,对于所有 3 个案例,我得到的结果都是相同的(是) - 但我想确定并且我确信我的测试案例不是很彻底。
最佳答案
默认的内部排序顺序(或 natural order )是一个未定义实现细节。维护顺序对于存储引擎来说是额外的开销,并且 MongoDB 的 API 不要求显式 sort()
或固定大小的特殊情况之外的可预测性 capped collections其中关联了 usage restrictions 。对于典型的工作负载,存储引擎最好尝试重用可用的预分配空间,并决定如何最有效地在磁盘和内存中存储数据。
如果没有任何查询条件,存储引擎将返回natural order中的结果(又名按照它们被发现的顺序)。结果顺序可能与插入顺序一致,但无法保证并且不能依赖此行为(除了上限集合之外)。
一些可能影响存储(自然)顺序的示例:
如果使用索引,文档将按找到的顺序返回(这必须与插入顺序或 I/O 顺序匹配)。如果使用多个索引,则顺序在内部取决于在重复数据删除过程中第一个识别文档的索引。
如果您想要可预测的排序顺序,您必须在查询中包含显式 sort()
并为排序键指定唯一值。
上限集合中自然顺序的实现异常是由其特殊使用限制强制执行的:文档按插入顺序存储,但现有文档大小无法增加,并且无法显式删除文档。排序是上限集合设计的一部分,可确保最旧的文档首先“老化”。
关于mongodb - 当没有指定排序顺序时,MongoDB 如何对记录进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45741638/
我是一名优秀的程序员,十分优秀!