1. 程式人生 > >Mongodb更新陣列$sort操作符

Mongodb更新陣列$sort操作符

一、$sort修飾符是在使用$push操作符的時候給陣列元素排序;

$sort修飾符必須和$each修飾符一起使用,你可以傳一個空陣列給$each修飾符來使$sort修飾符起作用;

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

二、通過文件中的欄位對文件進行排序

一個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 }
       }
     }
   }
)


更新之後陣列元素是按照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 ] }

四、更新陣列只使用sort

一個students

集合包含如下文件:

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

更新tests欄位並且並且降序排列;匹配{ $sort: -1 }和匹配一個空陣列給$each修飾符,就像如下文件:
db.students.update(
   { _id: 3 },
   { $push: { tests: { $each: [ ], $sort: -1 } } }
)

操作的結果是更新文件欄位並且按照降序排列:
{ "_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修飾符新增多個元素到文件的集合中;

$sort修飾符排列所有的文件中的元素按score降序;

$slice取排序後前三個文件集合;

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