繁体   English   中英

Model.find({}) 的默认排序行为是什么?

[英]What is the default ordering behavior for Model.find({})?

我正在使用这个 function

Model.find({})

返回集合中的所有文章...

退回文章的默认顺序是什么...

我查看了Model.find()官方 API但找不到我正在使用的上述语法...

不确定是否相关,但架构是:

schema.Article = new Schema({ 
  link:       { type: String, required: true  },
  image:      { type: String, required: true  },
  title:      { type: String, required: true  },
  summary:    { type: String, required: true  },
  tag:        { type: String, required: true, default: "health" },
  domain:     { type: String, required: true }, 
  timestamp:  { type: Date,   required: true, default: Date.now },
  owner:      { type: String, required: true, default: '5eebf1dc9148400351a49dd0' }
});

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

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

如果没有任何查询条件,存储引擎将按自然顺序(也就是找到它们的顺序)返回结果。 结果顺序可能与插入顺序一致,但不能保证并且不能依赖此行为(除了上限集合)。

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

  • WiredTiger 在磁盘上使用不同的文档表示
    与内存缓存相比,因此自然排序可能会根据
    内部数据结构。

  • 原始 MMAPv1 存储引擎(在 MongoDB 4.2 中删除)根据填充规则为文档分配记录空间。 如果文档超出当前分配的记录空间,则文档位置(和自然顺序)将受到影响。 由于删除或移动的文档,新文档也可以插入标记为可重复使用的存储中。

  • 复制使用幂等 oplog格式在副本集成员之间一致地应用写操作。 每个副本集成员都维护本地数据文件,这些文件可以按自然顺序变化,但在应用 oplog 更新时将具有相同的数据结果。

如果使用索引怎么办?

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

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

封顶的 collections 如何维护插入顺序?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM