$sort

在本页面

要使用$sort修饰符,它必须**与$each修饰符一起出现。您可以将空 array []传递给$each修饰符,以便只有$sort修饰符才有效。

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

对于<sort specification>

  • 要排序非文档的 array 元素,或者 array 元素是文档,要按整个文档排序,请指定1表示升序,或指定-1表示降序。

  • 如果 array 元素是文档,要按文档中的字段排序,请指定包含字段和方向的排序文档 i.e。 { field: 1 }{ field: -1 }。不要** reference 排序规范中包含 array 字段(e.g. { "arrayField.field": 1 }不正确)。

行为

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

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

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

例子

按文档中的字段对文档排序 Array

集合students包含以下文档:

{
  "_id": 1,
  "quizzes": [
    { "id" : 1, "score" : 6 },
    { "id" : 2, "score" : 9 }
  ]
}

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

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

重要 排序文档直接引用文档中的字段,并且不引用包含 array 字段的quizzes; i.e。 { score: 1 } { "quizzes.score": 1}

更新后,array 元素在升序score字段的 order 中:

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

排序不是文档的 Array 元素

集合students包含以下文档:

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

以下操作将另外两个元素添加到scores array 并对元素进行排序:

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

更新的文档具有scores array 升序 order 中的元素:

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

使用“仅排序”更新 Array

集合students包含以下文档:

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

要更新tests字段以按降序 order 对其元素进行排序,请指定{ $sort: -1 }并为$each修饰符指定空 array [],如下所示:

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

操作的结果是更新scores字段以按降序 order 对其元素进行排序:

{ "_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 array,

  • $sort修饰符按降序 order 中的score字段对修改后的quizzes array 的所有元素进行排序,并且

  • $slice修饰符只保留quizzes array 的第一个三个有序元素。

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 }
  ]
}

修饰符的 order 对于处理修饰符的 order 无关紧要。有关详细信息,请参阅修饰符