我希望通过数字值按降序排列数组名称中的文档列表。
这是我的收藏的结构部分:
_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" } }
你能帮助我吗?
答案 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。