按计数分组收集中的布尔值

pur*_*nes 2 mongodb mongodb-query aggregation-framework

如果我有以下数据:

[{
  flagOne: true,
  flagTwo: true
},
{
  flagOne: true,
  flagTwo: false
},
{
  flagOne: true,
  flagTwo: false
},
{
  flagOne: true,
  flagTwo: true,
  flagThree: true
}]
Run Code Online (Sandbox Code Playgroud)

请注意,该标志可能未设置,应视为false。

我如何得到这样的汇总结果?

{
  flagOne: 4,
  flagTwo: 2,
  flagThree: 1
}
Run Code Online (Sandbox Code Playgroud)

基本上,我想知道我的集合中按每个布尔标志分组的文档数。

Ser*_*kiy 5

是否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}}
])
Run Code Online (Sandbox Code Playgroud)

输出:

{
    "flagOne" : 4,
    "flagTwo" : 2,
    "flagThree" : 1
}
Run Code Online (Sandbox Code Playgroud)

如果您完全确定所有标志只能包含布尔值,则可以将查询简化为

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}}
])
Run Code Online (Sandbox Code Playgroud)