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

没有指定排序顺序时,MongoDB如何对记录进行排序?,mongodb,Mongodb,当我们在没有指定任何排序顺序的情况下运行Mongo find()查询时,数据库内部使用什么对结果进行排序 根据报告: 当执行不带参数的find()时,数据库返回 以正向自然顺序排列的对象 对于标准表,自然顺序不是特别有用,因为, 虽然顺序通常接近插入顺序,但并非如此 保证是。然而,对于封顶集合,自然顺序是 保证是插入顺序。这可能非常有用 但是,对于标准集合(无上限集合),使用哪个字段对结果进行排序? 是\u id字段还是其他内容 编辑: 基本上,我想我想得到的是,如果我执行以下搜索查询: db.

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

根据报告:

当执行不带参数的find()时,数据库返回 以正向自然顺序排列的对象

对于标准表,自然顺序不是特别有用,因为, 虽然顺序通常接近插入顺序,但并非如此 保证是。然而,对于封顶集合,自然顺序是 保证是插入顺序。这可能非常有用

但是,对于标准集合(无上限集合),使用哪个字段对结果进行排序? 是\u id字段还是其他内容

编辑:

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

db.collection.find({"x":y}).skip(10000).limit(1000);
在两个不同的时间点:t1t2,我会得到不同的结果集吗:

  • t1和t2之间没有额外写入时
  • t1和t2之间何时有新的写入
  • 在t1和t2之间添加了新的索引

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

    它是按存储顺序(文件中的顺序)返回的,但不能保证它们是按插入顺序返回的。它们不按_id字段排序。有时它看起来像是按插入顺序排序的,但在另一个请求中可能会发生变化。这是不可靠的

    当未指定任何排序顺序时,默认排序顺序是什么? 默认的内部排序顺序(or)是未定义的实现细节。维护订单对于存储引擎来说是额外的开销,MongoDB的API不要求在显式的
    sort()
    或固定大小的特殊情况下具有可预测性。对于典型的工作负载,存储引擎需要尝试重用可用的预分配空间,并决定如何最有效地将数据存储在磁盘和内存中

    如果没有任何查询条件,结果将由存储引擎以(aka的顺序)返回。结果顺序可能与插入顺序一致,但这种行为不能保证,也不能依赖(封顶集合除外)

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

    • WiredTiger对磁盘上的文档和内存缓存中的文档使用不同的表示形式,因此自然顺序可能会根据内部数据结构而改变
    • 原始的MMAPv1存储引擎(在MongoDB 4.2中删除)根据填充规则为文档分配记录空间。如果文档超出当前分配的记录空间,文档位置(和自然顺序)将受到影响。还可以将新文档插入到标记为可供删除或移动的文档重新使用的存储器中
    • 复制使用一种格式在副本集成员之间一致地应用写操作。每个副本集成员维护本地数据文件,这些文件可以按自然顺序变化,但在应用oplog更新时将具有相同的数据结果
    如果使用索引怎么办? 如果使用索引,文档将按照找到它们的顺序返回(这必然与插入顺序或I/O顺序匹配)。如果使用了多个索引,则顺序在内部取决于在重复数据消除过程中首先标识文档的索引

    如果需要可预测的排序顺序,则必须在查询中包含显式的排序(),并且排序键具有唯一值

    封顶集合如何维护插入顺序?
    capped collections中自然顺序的实现例外是由其特殊的使用限制强制执行的:文档以插入顺序存储,但不能增加现有文档的大小,也不能显式删除文档。排序是capped collection设计的一部分,它确保最旧的文档首先“过期”。

    那么这是否意味着如果我在两个不同的时间点运行相同的find命令:db.collection.find({“x”:y})。skip(20000)。limit(1000),我将得到不同的结果集?如果两个命令之间没有写操作,会发生什么情况?@saurabhj:添加了一些会影响自然顺序的示例。如果文档已被移动/删除,您可能会得到不同的结果集。如果没有文档插入/更新/删除,您应该会得到相同的结果。添加索引不会影响文档在磁盘上的位置。还应添加一条警告,即如果使用自然排序,副本集成员之间可能会有所不同。有人知道如何强制执行此处评论的两点中的任何一点吗?我们试图修改文档,但它们仍按插入顺序返回。。。我很好奇自然顺序是否与插入顺序不同。强制执行默认顺序(例如
    {createdAt:-1}
    )是实现乐观UI模式(在创建/更新/删除后不等待服务器响应而更新缓存中的数据列表)所必需的。否则,您无法匹配客户端乐观顺序和服务器响应顺序。