Model.find() 的默认排序行为是啥?

Posted

技术标签:

【中文标题】Model.find() 的默认排序行为是啥?【英文标题】:What is the default ordering behavior for Model.find()?Model.find() 的默认排序行为是什么? 【发布时间】:2020-10-27 02:14:02 【问题描述】:

我正在使用这个功能

Model.find()

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

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

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

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

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' 
);

【问题讨论】:

这能回答你的问题吗? How does MongoDB sort records when no sort order is specified? 【参考方案1】:

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

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

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

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

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

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

复制使用idempotent oplog 格式来应用写入 跨副本集成员的操作一致。每个副本集 member 维护可以按自然顺序变化的本地数据文件,但 应用 oplog 更新时将具有相同的数据结果。

如果使用索引会怎样?

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

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

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

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

【讨论】:

以上是关于Model.find() 的默认排序行为是啥?的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 返回按钮的默认行为是啥?

使用模板参数模板解决模棱两可调用的 C++ 默认行为是啥?

Oracle 默认行为排序

如何在 Django ORM 中更改 PostgreSQL 的默认空排序行为

除了属性,是啥决定了 html 元素的行为?

Apple UITabBarItem 类的默认“触摸”事件是啥?