$orderby
在此页面上
$orderby
$orderby
操作符按升序或降序对查询结果进行排序。mongosh
提供了cursor.sort()
方法:db.collection.find().sort( { age: -1 } ) 您还可以通过以下任一形式指定该选项:
db.collection.find()._addSpecial( "$orderby", { age : -1 } ) db.collection.find( { $query: {}, $orderby: { age : -1 } } ) 这些示例返回名为
collection
的集合中的所有文档,该集合按age
字段降序排序。 为$orderby
指定一个负值(例如-1
(如上)按降序排序,或为正值(例如1
)按升序排序。
行为
由于索引包含有序记录, MongoDB可以从包含排序字段的索引中获取排序结果。 如果排序使用与查询谓词相同的索引, MongoDB可以使用多个索引来支持排序操作。
如果 MongoDB 无法使用一个或多个索引来获取排序顺序,则 MongoDB 必须对数据执行阻塞排序操作。阻塞排序表示 MongoDB 必须在返回结果之前消耗并处理排序的所有输入文档。阻塞排序不会阻塞对集合或数据库的并发操作。
使用索引的排序操作通常比阻塞排序性能更好。有关创建索引以支持排序操作的更多信息,请参阅使用索引对查询结果进行排序。
如果 MongoDB 需要使用超过 100 MB 的系统内存来进行阻塞排序操作,则 MongoDB 将返回错误,除非查询指定 cursor.allowDiskUse()
(MongoDB 4.4 新增功能)。allowDiskUse()
允许 MongoDB 在处理阻塞排序操作时使用磁盘上的临时文件来存储超过 100 MB 系统内存限制的数据。
要避免此错误,请创建索引以支持排序操作或将$orderby
与cursor.maxTimeMS()
和/或cursor.limit()
结合使用。 cursor.limit()
通过优化算法提高返回此查询所需的速度并减少所需的内存量。 指定的限制必须导致文档数量不超过100 MB 限制。