javascript - Model.find({}) 的默认排序行为是什么?
问题描述
我正在使用这个功能
Model.find({})
返回集合中的所有文章...
退回文章的默认顺序是什么...
我查看了官方 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' }
});
解决方案
未指定时,默认排序顺序是什么?
默认的内部排序顺序(或自然顺序)是未定义的实现细节。维护顺序是存储引擎的额外开销,并且 MongoDB 的 API 不要求在明确或具有相关使用限制sort()
的固定大小上限集合的特殊情况之外的可预测性。对于典型的工作负载,存储引擎需要尝试重用可用的预分配空间,并决定如何最有效地将数据存储在磁盘和内存中。
如果没有任何查询条件,存储引擎将按自然顺序(也就是找到它们的顺序)返回结果。结果顺序可能与插入顺序一致,但不能保证并且不能依赖此行为(除了上限集合)。
一些可能影响存储(自然)顺序的示例:
WiredTiger 在磁盘上使用
与内存缓存不同的文档表示形式,因此自然顺序可能会根据
内部数据结构而改变。原始的 MMAPv1 存储引擎(在 MongoDB 4.2 中删除)根据填充规则为文档分配记录空间。如果文档超出当前分配的记录空间,则文档位置(和自然顺序)将受到影响。由于删除或移动的文档,新文档也可以插入标记为可重复使用的存储中。
复制使用幂等 oplog格式在副本集成员之间一致地应用写操作。每个副本集成员都维护本地数据文件,这些文件可以按自然顺序变化,但在应用 oplog 更新时将具有相同的数据结果。
如果使用索引怎么办?
如果使用索引,文档将按照它们被发现的顺序返回(它必须匹配插入顺序或 I/O 顺序)。如果使用了多个索引,则顺序在内部取决于在重复数据删除过程中首先标识文档的索引。
如果您想要一个可预测的排序顺序,您必须在查询中包含一个显式sort()
,并为您的排序键提供唯一值。
封顶集合如何维护插入顺序?
限制集合中的自然顺序的实现例外是由它们的特殊使用限制强制执行的:文档按插入顺序存储,但现有文档大小不能增加,并且不能显式删除文档。排序是封顶集合设计的一部分,可确保最旧的文档首先“过期”。
推荐阅读
- wcf - 我们可以在 wcf 服务中使用简单的注入器进行依赖注入吗?如何?
- visual-studio-code - vscode在launch.json上将环境变量传递给args
- tensorflow - flow_from_directory 类模式参数
- python - 学不到很简单的Keras模型
- html - 以角度编辑时未填充下拉菜单和单选按钮表单数组值
- mpi - 在使用 Linux 的 databricks 集群上运行 Open MPI 时出现“没有足够的插槽”错误
- android - react-native cli 和 Expo with Bare 工作流有什么区别?
- mongodb - 如果字段不存在或为空,猫鼬在字段更新时设置默认值
- rsyslog - 如何根据 Rsyslog 中的日志严重性过滤日志?
- javascript - TypeError 创建 Discord Bot - JS