$sort (aggregation)

在本页面

Definition

  • $sort
    • 对所有 Importing 文档进行排序,并将它们按排序 Sequences 返回到管道。

$sort阶段具有以下原型形式:

{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

$sort接收一个文档,该文档指定要作为排序依据的字段以及相应的排序 Sequences。 <sort order>可以具有以下值之一:

ValueDescription
1Sort ascending.
-1Sort descending.
{ $meta: "textScore" }按计算的textScore元数据按降序排序。有关示例,请参见Metadata Sort

如果在多个字段上排序,则从左到右评估排序 Sequences。例如,在上面的表格中,文档首先按<field1>排序。然后将具有相同<field1>值的文档按<field2>进一步排序。

Examples

Ascending/Descending Sort

对于要作为排序依据的一个或多个字段,将排序 Sequences 设置为1-1分别指定升序或降序排序,如以下示例所示:

db.users.aggregate(
   [
     { $sort : { age : -1, posts: 1 } }
   ]
)

此操作按age字段的降序对users集合中的文档进行排序,然后根据posts字段中的值按升序对文档进行排序。

比较不同BSON types的值时,MongoDB 使用以下比较 Sequences,从最低到最高:

  • MinKey(内部类型)

  • Null

  • 数字(整数,整数,双精度数,小数)

  • Symbol, String

  • Object

  • Array

  • BinData

  • ObjectId

  • Boolean

  • Date

  • Timestamp

  • Regular Expression

  • MaxKey(内部类型)

有关特定类型的比较/排序 Sequences 的详细信息,请参见Comparison/Sort Order

Metadata Sort

{ <sort-key> }文档中,为计算出的元数据指定一个新的字段名称,并将$meta表达式指定为其值,如以下示例所示:

db.users.aggregate(
   [
     { $match: { $text: { $search: "operating" } } },
     { $sort: { score: { $meta: "textScore" }, posts: -1 } }
   ]
)

此操作使用$text运算符来匹配文档,然后首先按"textScore"元数据排序,然后按posts字段的降序排序。指定的元数据确定排序 Sequences。例如,"textScore"元数据按降序排序。有关元数据的更多信息,请参见$meta

$ sort 运算符和内存

$ sort $ limit 内存优化

当管道中的$sort紧接在$limit之前时,$sort操作将仅保持n的最高结果,其中n是指定的限制,MongoDB 仅需要将n项存储在内存中。当allowDiskUsetruen项超过聚合内存限制时,此优化仍然适用。

优化可能会在版本之间进行更改。

$ sort 和内存限制

$sort阶段的 RAM 限制为 100 MB。默认情况下,如果阶段超出此限制,则$sort将产生错误。要允许处理大型数据集,请将allowDiskUse选项设置为true以启用$sort操作写入临时文件。有关详细信息,请参见db.collection.aggregate()方法中的allowDiskUse选项和aggregate命令。

在 2.6 版中进行了更改:$sort的内存限制从 RAM 的 10%更改为 100 MB 的 RAM。

$ sort 运算符和效果

$sort运算符放置在管道的“开始”处或**在$project$unwind$group聚合运算符之前,可以利用索引。如果在$sort操作之前发生$project$unwind$group,则$sort不能使用任何索引。