是的,考虑到有多个数组,这有点困难,如果您同时尝试两个数组,您最终会得到“笛卡尔条件”,其中一个数组乘以另一个数组的内容。
因此,只需在开头组合数组内容,这可能表明您应该如何首先存储数据:
Model.aggregate(
[
{ "$project": {
"company": 1,
"model": 1,
"data": {
"$setUnion": [
{ "$map": {
"input": "$pros",
"as": "pro",
"in": {
"type": { "$literal": "pro" },
"value": "$$pro"
}
}},
{ "$map": {
"input": "$cons",
"as": "con",
"in": {
"type": { "$literal": "con" },
"value": "$$con"
}
}}
]
}
}},
{ "$unwind": "$data" }
{ "$group": {
"_id": {
"company": "$company",
"model": "$model",
"tag": "$data.value"
},
"pros": {
"$sum": {
"$cond": [
{ "$eq": [ "$data.type", "pro" ] },
1,
0
]
}
},
"cons": {
"$sum": {
"$cond": [
{ "$eq": [ "$data.type", "con" ] },
1,
0
]
}
}
}
],
function(err,result) {
}
)
索非亚第一$project http://docs.mongodb.org/master/reference/operator/aggregation/project/上演$map http://docs.mongodb.org/master/reference/operator/aggregation/map/运算符将“type”值添加到每个数组的每个项目。这并不是说它真的很重要,因为无论如何所有项目都应该处理“唯一”,$setUnion http://docs.mongodb.org/master/reference/operator/aggregation/setUnion/运算符将每个数组“连接”为单个数组。
如前所述,您可能应该首先以这种方式存储。
然后处理$unwind http://docs.mongodb.org/master/reference/operator/aggregation/unwind/其次是$group http://docs.mongodb.org/master/reference/operator/aggregation/group/,其中每个“优点”和“缺点”然后通过评估$cond http://docs.mongodb.org/master/reference/operator/aggregation/cond/为它匹配的“类型”,要么返回1
or 0
比赛分别在哪里true/false
to the $sum http://docs.mongodb.org/master/reference/operator/aggregation/sum/聚合累加器。
这为您提供了一个“逻辑匹配”,可以根据指定的分组键对聚合操作中的每个相应“类型”进行计数。