按集合计算布尔值

时间:2017-01-30 16:56:18

标签: mongodb mongodb-query aggregation-framework

如果我有以下数据:

[{
  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
}

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

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}}
])