Docs 菜单
Docs 主页
/
MongoDB Manual
/ / / /

$sort

在此页面上

  • 行为
  • 示例
$sort

$push 操作中, $sort 修饰符对数组元素进行排序。

要使用 $sort 修饰符,它必须$each 修饰符同时出现。您可以将一个空数组 [] 传递给 $each 修饰符,从而只让 $sort 修饰符起作用。

{
$push: {
<field>: {
$each: [ <value1>, <value2>, ... ],
$sort: <sort specification>
}
}
}

对于<sort specification>

  • 如需对非文档的数组元素排序,或者如果数组元素是文档,要按整个文档排序,则指定 1 为升序,或指定 -1 为降序。

  • 如果数组元素是文档,要按文档中的字段进行排序,请指定包含字段和方向的排序文档,即 { field: 1 }{ field: -1 }请勿在排序规范中引用包含的数组字段(例如{ "arrayField.field": 1 } 不正确)。

从 MongoDB 5.0 开始,更新操作符按字典顺序处理具有基于字符串的名称的文档字段。具有数字名称的字段按数字顺序处理。详情请参阅更新操作符行为

$sort 修饰符可以对不是文档的数组元素进行排序。在以前的版本中,$sort 修饰符要求数组元素是文档。

如果数组元素是文档,则修饰符可以按整个文档或文档中的特定字段进行排序。在以前的版本中,$sort 修饰符只能按文档中的特定字段排序。

尝试使用没有 $each 修饰符的 $sort 修饰符会导致错误。$sort 不再需要 $slice 修饰符。有关 $push 可用的修饰符列表,请参阅修饰符

创建 students 集合:

db.students.insertOne(
{
"_id": 1,
"quizzes": [
{ "id" : 1, "score" : 6 },
{ "id" : 2, "score" : 9 }
]
}
)

以下更新将其他文档附加到 quizzes 数组,然后按升序 score 字段对数组的所有元素进行排序:

db.students.updateOne(
{ _id: 1 },
{
$push: {
quizzes: {
$each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ],
$sort: { score: 1 }
}
}
}
)

重要

排序文档直接引用文档中的字段,而不引用包含数组字段quizzes ;即{ score: 1 }不是{ "quizzes.score": 1}

更新后,数组元素按升序排列 score 字段:

{
"_id" : 1,
"quizzes" : [
{ "id" : 1, "score" : 6 },
{ "id" : 5, "score" : 6 },
{ "id" : 4, "score" : 7 },
{ "id" : 3, "score" : 8 },
{ "id" : 2, "score" : 9 }
]
}

将以下文档添加到 students 集合中:

db.students.insertOne( { "_id" : 2, "tests" : [ 89, 70, 89, 50 ] } )

以下操作将另外两个元素添加到 tests 数组中并对元素进行排序:

db.students.updateOne(
{ _id: 2 },
{ $push: { tests: { $each: [ 40, 60 ], $sort: 1 } } }
)

在更新后的文档中,tests 数组的元素按升序排列:

{ "_id" : 2, "tests" : [ 40, 50, 60, 70, 89, 89 ] }

将以下文档添加到 students 集合中:

db.students.insertOne( { "_id" : 3, "tests" : [ 89, 70, 100, 20 ] } )

要更新 tests 字段以按降序对其元素进行排序,请指定 { $sort: -1 } 并为 $each 修饰符指定一个空数组 []。例如:

db.students.updateOne(
{ _id: 3 },
{ $push: { tests: { $each: [ ], $sort: -1 } } }
)

该示例按降序对 tests 字段值进行排序:

{ "_id" : 3, "tests" : [ 100, 89, 70, 20 ] }

将以下文档添加到 students 集合中:

db.students.insertOne(
{
"_id" : 5,
"quizzes" : [
{ "wk": 1, "score" : 10 },
{ "wk": 2, "score" : 8 },
{ "wk": 3, "score" : 5 },
{ "wk": 4, "score" : 6 }
]
}
)

以下 $push 操作使用:

  • $each 修饰符将多个文档添加到 quizzes 数组,

  • $sort 修饰符,按 score 字段降序对修改后的 quizzes 数组的所有元素进行排序,以及

  • $slice 修饰符仅保留 quizzes 数组的三个排序元素。

db.students.updateOne(
{ _id: 5 },
{
$push: {
quizzes: {
$each: [ { wk: 5, score: 8 }, { wk: 6, score: 7 }, { wk: 7, score: 6 } ],
$sort: { score: -1 },
$slice: 3
}
}
}
)

操作后,数组中只有三个得分最高的测验:

{
"_id" : 5,
"quizzes" : [
{ "wk" : 1, "score" : 10 },
{ "wk" : 2, "score" : 8 },
{ "wk" : 5, "score" : 8 }
]
}

查询中修改器的顺序不会改变修改器的应用顺序。有关详细信息,请参阅修改器。

后退

$slice

在此页面上