On this page
$sort
在本页面
要使用$sort修饰符,它必须与$each修饰符一起出现。您可以将一个空数组[]
传递给$each修饰符,以使只有$sort修饰符起作用。
{
$push: {
<field>: {
$each: [ <value1>, <value2>, ... ],
$sort: <sort specification>
}
}
}
对于<sort specification>
:
要对不是文档的数组元素进行排序,或者如果数组元素是文档,则要对整个文档进行排序,请指定
1
升序或-1
降序。如果数组元素是文档,则要按文档中的字段排序,请使用字段和方向(即
{ field: 1 }
或{ field: -1 }
)指定排序文档。不要**不引用排序规范中的包含数组字段(例如{ "arrayField.field": 1 }
不正确)。
Behavior
$sort修饰符可以对不是文档的数组元素进行排序。在以前的版本中,$sort修饰符要求数组元素为文档。
如果数组元素是文档,则修饰符可以按整个文档或文档中的特定字段进行排序。在以前的版本中,$sort修饰符只能按文档中的特定字段排序。
尝试使用没有$each修饰符的$sort修饰符会导致错误。 $sort不再需要$slice修饰符。有关$push可用的修饰符的列表,请参见Modifiers。
Examples
按文档中的字段对文档数组进行排序
集合students
包含以下文档:
{
"_id": 1,
"quizzes": [
{ "id" : 1, "score" : 6 },
{ "id" : 2, "score" : 9 }
]
}
以下更新将其他文档附加到quizzes
数组,然后按升序score
字段对数组的所有元素进行排序:
db.students.update(
{ _id: 1 },
{
$push: {
quizzes: {
$each: [ { id: 3, score: 8 }, { id: 4, score: 7 }, { id: 5, score: 6 } ],
$sort: { score: 1 }
}
}
}
)
Important
排序文档直接引用文档中的字段,而不引用包含数组的字段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
包含以下文档:
{ "_id" : 2, "tests" : [ 89, 70, 89, 50 ] }
以下操作将另外两个元素添加到scores
数组并对元素进行排序:
db.students.update(
{ _id: 2 },
{ $push: { tests: { $each: [ 40, 60 ], $sort: 1 } } }
)
更新后的文档具有按升序排列的scores
数组的元素:
{ "_id" : 2, "tests" : [ 40, 50, 60, 70, 89, 89 ] }
仅使用排序来更新数组
集合students
包含以下文档:
{ "_id" : 3, "tests" : [ 89, 70, 100, 20 ] }
要更新tests
字段以按降序对其元素排序,请指定{ $sort: -1 }
并为$each修饰符指定一个空数组[]
,如下所示:
db.students.update(
{ _id: 3 },
{ $push: { tests: { $each: [ ], $sort: -1 } } }
)
该操作的结果是更新scores
字段以对其元素进行降序排序:
{ "_id" : 3, "tests" : [ 100, 89, 70, 20 ] }
将$ sort 与其他$ push 修饰符一起使用
集合students
包含以下文档:
{
"_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.update(
{ _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 }
]
}
修饰符的 Sequences 与修饰符的处理 Sequences 无关紧要。有关详情,请参见Modifiers。