gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:01:42 32 4
gpt4 key购买 nike

当我们在没有指定任何排序顺序的情况下运行 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 )是一个未定义实现细节。维护顺序对于存储引擎来说是额外的开销,并且 MongoDB 的 API 不要求显式 sort() 或固定大小的特殊情况之外的可预测性 capped collections其中关联了 usage restrictions 。对于典型的工作负载,存储引擎最好尝试重用可用的预分配空间,并决定如何最有效地在磁盘和内存中存储数据。

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

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

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

如果使用索引怎么办?

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

如果您想要可预测的排序顺序,您必须在查询中包含显式 sort() 并为排序键指定唯一值。

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

上限集合中自然顺序的实现异常是由其特殊使用限制强制执行的:文档按插入顺序存储,但现有文档大小无法增加,并且无法显式删除文档。排序是上限集合设计的一部分,可确保最旧的文档首先“老化”。

关于mongodb - 当没有指定排序顺序时,MongoDB 如何对记录进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45741638/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com