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

根据documentation on the mongo website人的说法:

当执行不带参数的find()时,数据库返回

对于标准表格,自然顺序不是特别有用,因为,

但是,对于标准集合(无上限集合),使用哪个字段对结果进行排序?

Edit:

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

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

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

  1. 在t1和amp;t2?
  2. 当t1和amp;t2?
  3. t1&t2?

我在一个临时数据库上运行了一些测试,我得到的所有3个 case 的结果都是相同的(Yes),但我想确定,我确定我的测试 case 不是很彻底.

推荐答案

如果没有指定,默认的排序顺序是什么?

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

如果没有任何查询条件,存储引擎将在natural order(又名in the order they are found)中返回结果.结果顺序可能与插入顺序一致,但这种行为不能保证,也不能依赖(封顶集合除外).

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

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

如果使用索引呢?

如果使用索引,文档将按找到的顺序返回(这必然与插入顺序或I/O顺序匹配).如果使用了多个索引,则顺序在内部取决于在重复数据消除过程中首先识别文档的索引.

如果想要可预测的排序顺序,可以在查询中包含一个显式的sort(),并为排序键提供唯一的值.

封顶集合如何维护插入顺序?

capped collections中自然顺序的实现例外是由其特殊的使用限制强制执行的:文档以插入顺序存储,但不能增加现有文档的大小,也不能显式删除文档.订购是封顶Collection 设计的一部分,可确保最古老的文档首先"过时".

Mongodb相关问答推荐

MongoDB与合并对象聚合

获取文档字段名并将其作为嵌套字段添加到聚合中

为什么这个查询可以在MongoDB中使用?

我无法在react 中使用 fetch 和express 从数据库中删除数据

MongoDB - 来自先前匹配文档的聚合匹配字段

如何使用 MindsDB 和 MQL(对于我的 MongoDB 实例)实施零样本分类?

在 ExpirePolicy 之后从 Store 中删除元素

Mongodb聚合查找异常值

通过 docker 运行的 MongoDB 服务器无法互相看到(名称解析中的临时故障)

在推入 mongodb 时自动填充 golang struct 中的 created_at 和 updated_at

Mongodb 仅在值唯一时插入,否则更新 - 在 node.js 中

更新 mongoengine 中的嵌入文档列表

MongoDB 的 BinData(0, "e8MEnzZoFyMmD7WSHdNrFJyEk8M=") 中的0是什么意思?

Mongoose 和新架构:返回ReferenceError: Schema is not defined

MongoDB:在集合上设置 TTL 索引时出错: sessions

Cannot connect to MongoDB errno:61

如何使用 mgo 和 Go 查询 MongoDB 的日期范围?

在 MongoDB 上分片 GridFS

是否可以使用聚合框架对 MongoDB 中的 2 个字段求和?

MongoDB Compass 中 JSON 输入意外结束