mongodb - 未指定排序顺序时,MongoDB 如何对记录进行排序?

当我们在没有指定任何排序顺序的情况下运行 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);

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

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

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

最佳答案

未指定时的默认排序顺序是什么?

默认的内部排序顺序(或 natural order)是 undefined 实现细节。维护顺序是存储引擎的额外开销,并且 MongoDB 的 API 不要求在显式 sort() 或固定大小 capped collections 的特殊情况之外的可预测性。有关联的usage restrictions .对于典型的工作负载,存储引擎需要尝试重用可用的预分配空间,并决定如何最有效地将数据存储在磁盘和内存中。

没有任何查询条件,存储引擎将返回natural order中的结果(又名按照它们被发现的顺序)。结果顺序可能与插入顺序一致,但不能保证并且不能依赖此行为(上限集合除外)。

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

  • WiredTiger 在磁盘上与内存缓存中使用不同的文档表示形式,因此自然顺序可能会根据内部数据结构而改变。
  • 原始的 MMAPv1 存储引擎(在 MongoDB 4.2 中已删除)根据填充规则为文档分配记录空间。如果文档超出当前分配的记录空间,则文档位置(和自然顺序)将受到影响。由于已删除或移动文档,新文档也可以插入标记为可重复使用的存储中。
  • 复制使用 idempotent oplog格式以在副本集成员之间一致地应用写入操作。每个副本集成员都维护本地数据文件,这些数据文件可以按自然顺序变化,但在应用 oplog 更新时将具有相同的数据结果。

如果使用索引会怎样?

如果使用索引,文档将按照它们被发现的顺序返回(它必须匹配插入顺序或 I/O 顺序)。如果使用了多个索引,则顺序在内部取决于在重复数据删除过程中首先标识文档的索引。

如果您想要一个可预测的排序顺序,您必须在您的查询中包含一个明确的 sort() 并为您的排序键提供唯一值。

上限集合如何维护插入顺序?

在上限集合中为自然顺序记录的实现异常是由它们的特殊使用限制强制执行的:文档按插入顺序存储,但现有文档大小不能增加,并且不能显式删除文档。排序是封顶集合设计的一部分,可确保最旧的文档首先“过期”。

https://stackoverflow.com/questions/11599069/

相关文章:

mongodb - 如何在 MongoDB 中将集合导出到 CSV?

mongodb - MongoDB 中 Multi-Tenancy 数据库的推荐方法是什么?

mongodb - 在 MongoDB 中查找重复记录

MongoDB GPG - 无效签名

mongodb - 在 Mongoose/MongoDB 中创建多字段索引

mongodb - 值不为空的 Mongoose 查询

python - 用于 Python 的 MongoDB ORM?

node.js - Mongoose findByIdAndUpdate 没有返回正确的模型

javascript - Mongoose .js : Find user by username

ruby - Mongoid 还是 MongoMapper?