如果我有以下数据:
[{
flagOne: true,
flagTwo: true
},
{
flagOne: true,
flagTwo: false
},
{
flagOne: true,
flagTwo: false
},
{
flagOne: true,
flagTwo: true,
flagThree: true
}]
请注意,可能未设置该标志,应将其视为false。
如何获得类似此聚合结果的内容?
{
flagOne: 4,
flagTwo: 2,
flagThree: 1
}
基本上,我想知道我的集合中的文档数量按每个布尔标记分组。
答案 0 :(得分:4)
flagThree
是否存在,或者它是否等于"tomato"
并不重要。只有在标志值true
时才计算标记:
db.getCollection('so').aggregate([
{
$group: {
_id : 1,
flagOne: {$sum: {$cond: [{$eq:["$flagOne", true]}, 1, 0]}},
flagTwo: {$sum: {$cond: [{$eq:["$flagTwo", true]}, 1, 0]}},
flagThree: {$sum: {$cond: [{$eq:["$flagThree", true]}, 1, 0]}},
}
},
{$project: {_id:0}}
])
输出:
{
"flagOne" : 4,
"flagTwo" : 2,
"flagThree" : 1
}
如果您完全确定所有标志只能包含布尔值,则可以将查询简化为
db.getCollection('so').aggregate([
{
$group: {
_id : 1,
flagOne: {$sum: {$cond: ["$flagOne", 1, 0]}},
flagTwo: {$sum: {$cond: ["$flagTwo", 1, 0]}},
flagThree: {$sum: {$cond: ["$flagThree", 1, 0]}},
}
},
{$project: {_id:0}}
])