我有以下计数查询:
db.collection.count({code : {$in : ['delta', 'beta']}});
db.collection.count({code : 'alpha'});
对于给定的数据集
[
{
"code": "detla",
"name": "delta1"
},
{
"code": "detla",
"name": "delta2"
},
{
"code": "detla",
"name": "delta3"
},
{
"code": "detla",
"name": "delta4"
},
{
"code": "beta",
"name": "beta1"
},
{
"code": "beta",
"name": "beta2"
},
{
"code": "beta",
"name": "beta3"
},
{
"code": "beta",
"name": "beta4"
},
{
"code": "beta",
"name": "beta5"
},
{
"code": "alpha",
"name": "alpha1"
},
{
"code": "alpha",
"name": "alpha2"
},
{
"code": "alpha",
"name": "alpha3"
}
]
是否可以使用 单聚合() 并在 mongodb@3.2 中嵌套$ group来实现此目的?
我知道这是 mapReduce()的经典用例,但是由于参数$ group by参数(上例中的code
)是动态生成的属性,因此我在这里不可行,因此聚合阶段的构建也是动态的。
预期的输出与两个计数查询的结果相同。 ->第一计数查询(delta,beta组合计数)-> 9 ->第二计数查询(字母计数)-> 3
答案 0 :(得分:1)
您可以在$group
aggregation
db.collection.aggregate([
{ "$group": {
"_id": null,
"first": {
"$sum": {
"$cond": [{ "$in": ["$code", ["detla", "beta"]] }, 1, 0]
}
},
"second": {
"$sum": {
"$cond": [{ "$eq": ["alpha", "$code"] }, 1, 0]
}
}
}}
])
但是我宁愿使用两个count查询来获得更好的性能
$in
也发布了版本 3.4 。您可以在以前的版本中使用$setIsSubset
db.collection.aggregate([
{ "$group": {
"_id": null,
"first": {
"$sum": {
"$cond": [{ "$setIsSubset": [["$code"], ["detla", "beta"]] }, 1, 0]
}
},
"second": {
"$sum": {
"$cond": [{ "$eq": ["alpha", "$code"] }, 1, 0]
}
}
}}
])