用于MongoDB排序的数组

时间:2014-12-12 02:54:28

标签: mongodb mongodb-query bson

我希望通过数字值按降序排列数组名称中的文档列表。

这是我的收藏的结构部分:

_id: ObjectId("W")
var1: "X",
var2: "Y",
var3: "Z",
comments: {
   names: [
      {
         number: 1;
      },
      {
         number: 3;
      },
      {
         number: 2;
      }
   ],
   field: Y;
}

但我对db.collection.find().sort( { "comments.names.number": -1 } )的所有请求都不起作用。

所需的输出排序是:

{ "_id" : ObjectId("W"), "var1" : "X", "var3" : "Z", "comments" : { [ { "number" : 3 }, { "number" : 2 },{ "number" : 1 } ], "field": "Y" } }

你能帮助我吗?

3 个答案:

答案 0 :(得分:1)

您需要汇总结果,如下所示:

  • Unwind名字数组。
  • Sort基于comments.names.number的记录以降序排列 顺序。
  • Group基于_id字段的记录。
  • project所需的结构。

代码:

 db.collection.aggregate([
 {$unwind:"$comments.names"},
 {$sort:{"comments.names.number":-1}},
 {$group:{"_id":"$_id",
          "var1":{$first:"$var1"},
          "var2":{$first:"$var2"},
          "var3":{$first:"$var3"},
          "field":{$first:"$comments.field"},
          "names":{$push:"$comments.names"}}},
 {$project:{"comments":{"names":"$names","field":"$field"},"var1":1,
            "var2":1,"var3":1}}  
 ],{"allowDiskUse":true})

如果您的集合很大,您可能希望在聚合管道的开头添加$match条件来过滤记录或使用(allowDiskUse:true),以便于对大量记录进行排序。

 db.collection.aggregate([
 {$match:{"_id":someId}},
 {$unwind:"$comments.names"},
 {$sort:{"comments.names.number":-1}},
 {$group:{"_id":"$_id",
          "var1":{$first:"$var1"},
          "var2":{$first:"$var2"},
          "var3":{$first:"$var3"},
          "field":{$first:"$comments.field"},
          "names":{$push:"$comments.names"}}},
 {$project:{"comments":{"names":"$names","field":"$field"},"var1":1,
            "var2":1,"var3":1}}  
 ])

以下查询的作用:

db.collection.find().sort( { "comments.names.number": -1 } )

是查找所有文档,然后根据数字字段按降序对这些文档进行排序。这实际上是为每个文档获取每个文档的最大comments.names.number字段值。然后根据此编号对父文档进行排序。它不会操纵每个父文档中的names数组。

答案 1 :(得分:0)

您需要更新文档以对数组进行排序。

db.collection.update(
   { _id: 1 },
   {
     $push: {
       comments.names: {
          $each: [ ],
          $sort: { number: -1 }
       }
     }
   }
)

检查文档: http://docs.mongodb.org/manual/reference/operator/update/sort/#use-sort-with-other-push-modifiers

答案 2 :(得分:0)

MongoDB查询根据排序中指定的字段集合对结果文档进行排序。它们不对文档中的数组进行排序。如果要对数组进行排序,则需要在检索文档后自行对其进行排序,或者按排序顺序存储数组。请参阅Stennie的this old SO answer