我的收藏夹中有这样的数据:
{
"_id" : ObjectId("5b29fc8a0d206c33115cdf87"),
"Cost" : 20,
"Desc" : "Cost of purchase",
"Category" : "C1",
"Vendor" : "Vendor 2"
}
{
"_id" : ObjectId("5b29fc8a0d206c33115cdf88"),
"Cost" : 40,
"Desc" : "Cost of repairs",
"Category" : "C1",
"Vendor" : "Vendor 1",
}........ so on
我想对此进行嵌套聚合,以在Vendor上按以下方式获取数据:
[
{
"_id": "Cost of purchase",
"Value": [
{
"Vendor": "Vendor 1",
"Sum_Cost": 40
},
{
"Vendor": "Vendor 2",
"Sum_Cost": 20
}
]
}
]
但是我没有在供应商上对数据进行排序。我正在获取类似的数据:
[
{
"_id": "Cost of purchase",
"Value": [
{
"Vendor": "Vendor 2",
"Sum_Cost": 20
},
{
"Vendor": "Vendor 1",
"Sum_Cost": 40
}
]
}
]
这是我到目前为止用Desc和Vendor上的嵌套分组完成的代码,以求总成本。但是我的排序不起作用,因为它假定使用Vendor对对象数组内的数据进行排序:
let aggreArray = [{
$group: {
_id: {
Desc: "$Desc",
Vendor: "$Vendor"
},
sum: {
"$sum": "$Cost"
}
}
}, {
$group: {
_id: "$_id.Desc",
Value: {
$push: {
Vendor: "$_id.Vendor",
value: "$sum"
}
}
}
},{
$sort: { "Value.Vendor": 1}
}];
db.collection.aggregate(aggreArray).toArray(function (err, docs) {
console.log(docs);
});
答案 0 :(得分:0)
我发现@Ashh的解决方案有效,但只是为了清楚起见,所以我们知道这个问题已经有了解决方案,而不是从评论中读取,我添加了这个答案。
let aggreArray = [{
$group: {
_id: {
Desc: "$Desc",
Vendor: "$Vendor"
},
sum: {
"$sum": "$Cost"
}
}
},
{ $sort: { "Value.Vendor": 1} },
{
$group: {
_id: "$_id.Desc",
Value: {
$push: {
Vendor: "$_id.Vendor",
value: "$sum"
}
}
}
}];
db.collection.aggregate(aggreArray).toArray(function (err, docs) {
console.log(docs);
});
基于@Ashh在评论部分的回答。