在上一篇 mongodb Aggregation聚合操作之$match 中详细介绍了mongodb聚合操作中的$match使用以及参数细节。本篇将开始介绍Aggregation聚合操作中的$sort操作。
说明:
对所有输入文档进行排序,并将它们按排序顺序返回到管道。
语法:
{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }
$sort接收一个文档,该文档指定要排序的字段和相应的排序顺序。<排序顺序>可以有以下值之一:
1:升序排序
-1:降序排序
{ $meta: "textScore" }:按计算的textScore元数据降序排序。
注意【如果对多个字段进行排序,则从左到右计算排序顺序。例如,在上面的表单中,文档首先按<field1>排序。然后,具有相同<field1>值的文档按<field2>进一步排序。】示例
1. 示例
1.1. 普通排序
对于要排序的字段或字段,将排序顺序设置为1或-1,分别指定升序或降序排序,如下例所示:该操作对users集合中的文档进行排序,根据age字段降序排列,然后根据posts字段中的值升序排列。
db.users.aggregate(
[
{ $sort : { age : -1, posts: 1 } }
]
)
1.2. 元数据排序
在{<sort-key>}文档中指定计算出的元数据的新字段名,并指定$meta表达式作为它的值,如下面的示例所示:该操作使用$text操作符匹配文档,然后首先按“textScore”元数据排序,然后按posts字段的降序排序。指定的元数据决定排序顺序。例如,“textScore”元数据按降序排序。
db.users.aggregate(
[
{ $match: { $text: { $search: "operating" } } },
{ $sort: { score: { $meta: "textScore" }, posts: -1 } }
]
)
1.3. $sort操作符和内存
$sort + $limit内存优化
当$sort在$limit之前并且没有修改文档数量的中间阶段时,优化器可以将$limit合并到$sort中。这允许$sort操作在进行过程中只维护顶部的n个结果,其中n是指定的限制,并确保MongoDB只需要在内存中存储n个项目。当allowDiskUse为true且n项超过聚合内存限制时,这种优化仍然适用。优化可能会在不同版本之间发生变化。
1.4. $sort和内存限制
$sort阶段的RAM有100兆字节的限制。默认情况下,如果阶段超过这个限制,$sort将产生一个错误。为了允许处理大型数据集,将allowDiskUse选项设置为true,以允许$sort操作写入临时文件。有关详细信息,请参阅db.collection.aggregate()方法中的allowDiskUse选项和aggregate命令。
版本2.6中的变化:$sort的内存限制从RAM的10%更改为100兆字节。
1.5. $sort操作符和性能
如果将$sort操作符放置在管道的开头,或放置在$project、$unwind和$group聚合操作符之前,则可以利用索引。如果$project、$unwind或$group发生在$sort操作之前,则$sort不能使用任何索引