这是我的MongoDB集合架构:
company: String
model: String
tags: [String]
我需要聚合它,以便得到以下输出:
[{
"_id": {
"company": "Lenovo",
"model": "T400"
},
"tags": {
tag: "SomeTag"
count: 124 // number of times, this tag was found in `Lenovo T400`
}
}...]
我尝试执行以下操作:
var aggParams = {};
aggParams.push({ $unwind: '$tags' });
aggParams.push({ $group: {
_id: { company: '$company', model: '$model' },
tags: { $push: { tag: '$tags', count: { $sum: 1 } } },
}});
但是我收到了以下错误:
invalid operator '$sum'
使用aggregation
执行此操作的正确方法是什么?
答案 0 :(得分:3)
您需要在数组上处理$unwind
,以便在聚合中处理它。你也添加到一个数组和"计数"分开一个阶段。以及"数组中的聚合管道"参数本身,而不是您定义的对象:
Model.aggregate([
{ "$unwind": "$tags" },
{ "$group": {
"_id": {
"company": "$company",
"model": "$model",
"tag": "$tags"
},
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": {
"company": "$_id.company",
"model": "$_id.model",
},
"tags": { "$push": { "tag": "$_id.tag", "count": "$count" }
}}
], function(err,result) {
})
所以这里有两个$group
阶段的工作。一个用于总结公司和模型中的标签,另一个用于组合公司"和"模型"并将不同的标签和计数添加到数组中。