如何使用聚合框架计算MongoDB中的布尔值

jfe*_*g92 12 mongodb aggregation-framework

文档存储有以下字段:

_id:
NumberofChildren: Integer
OwnsAHome: Boolean
Income: Integer
Run Code Online (Sandbox Code Playgroud)

我需要使用聚合框架按子节点数排序,所以输出是这样的:

Number of Children: 3
Number of People: some value, say 17
Number of People who own a home: some value less than 17 which is a sum of the number of true Booleans
Average income: some value
Run Code Online (Sandbox Code Playgroud)

我会怎么做这与聚集的MongoDB,特别是关于计数的次数多少Boolean OwnsAHome,是true

谢谢!

Asy*_*sky 16

$project通过允许您创建具有与原始字段不同的类型和值的新字段,该阶段是您在管道中的朋友.

考虑这个投影,$cond当某些事情为真时使用一个值,而当它为假时使用另一个值:

{$ project:{numWhoOwnHome:{$ cond:["$ OwnsAHome",1,0]}}}

如果您现在$group使用{$sum : "$numWhoOwnHome"}您的结果将是OwnsAHome设置为true的人数.

  • `{'$ group':{.... {count:{$ sum:{$ cond:["$ closed",1,0]}} ...}`$ cond适用于$ group自3.2版以来 (9认同)
  • 不要忘记为每个要包含"fieldName:1"的字段添加$ project,否则$ project中唯一出现的是_id字段和这个新的计算字段. (3认同)

Man*_*lon 6

我遵循@eri建议使用$cond

给定数据:

campaign | flags.click | flags.removed
c1       | true        | false
c1       | true        | true
c2       | false       | false
Run Code Online (Sandbox Code Playgroud)

与:

Contact.aggregate(
    [
        {
            $group: {
                _id: "$campaign",
                countClick: {
                    $sum: { $cond: ["$flags.click", 1, 0] }
                },
                countRemoved: {
                    $sum: { $cond: ["$flags.removed", 1, 0] }
                },
            }
        }
    ]
).exec();
Run Code Online (Sandbox Code Playgroud)

我将得到输出:

campaign | countClick | countRemoved
c1       | 2          | 1
c2       | 0          | 0
Run Code Online (Sandbox Code Playgroud)