$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 ] }
将$sort
与其他$push
修饰符一起使用
将以下文档添加到 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 } ] }
查询中修改器的顺序不会改变修改器的应用顺序。有关详细信息,请参阅修改器。