在mongo聚合管道中,如何在使用sum运算符时区分null和0

时间:2017-03-07 11:35:51

标签: mongodb aggregation-framework

我正在使用mongo 3.0.4按键分组数据。假设我们有一些mongo文件,比如

{'a': 1, 'b': 2, 'name': 'leo'}
{'a': 1, 'b': 2, 'name': 'leo'}
{'a': 2, 'b': 2, 'c': 0, 'name': 'amy'}
{'a': 2, 'b': 2, 'c': 0, 'name': 'amy'}

我尝试按键“名称”汇总,并使用下面的代码汇总所有a,b,c字段

[
{
    '$group': {
        '_id': '$name',
        'a': {
            '$sum': '$a'
        },
        'b': {
            '$sum': '$b'
        },
        'c': {
            '$sum': '$c'
        }
    }
}
]

并获得结果

[
{
    '_id': 'leo',
    'a': 2,
    'b': 4,
    'c': 0
},
{
    '_id': 'amy',
    'a': 4,
    'b': 4,
    'c': 0
}
]

问题是组leo中的“c”字段也是0,我希望它为null。 并且预期的结果应该是

[
{
    '_id': 'leo',
    'a': 2,
    'b': 4,
    'c': null
},
{
    '_id': 'amy',
    'a': 4,
    'b': 4,
    'c': 0
}
]

[
{
    '_id': 'leo',
    'a': 2,
    'b': 4
},
{
    '_id': 'amy',
    'a': 4,
    'b': 4,
    'c': 0
}
]

我知道$sum运算符将无数字字段视为0,所以有没有办法做到这一点?使用sum运算符时,如何区分null和0?

2 个答案:

答案 0 :(得分:1)

我试过这个,可能这对你有帮助

    db.gg.aggregate([{
            '$group': {
                '_id': '$name',
                'a': {
                    '$sum': '$a'
                },
                'b': {
                    '$sum': '$b'
                },
                'c': {
                    '$sum': '$c'
                },
                cdata: {
                    $push: {
                        c: "$c"
                    }
                }
            }
        },

        {
            $project: {
                _id: 1,
                a: 1,
                b: 1,
                c: {
                    $cond: [{
                        $eq: [{
                            $setIsSubset: [
                                [{}], "$cdata"
                            ]
                        }, true]
                    }, null, "$c"]
                }
            }
        }
    ])

输出:

     { "_id" : "amy", "a" : 4, "b" : 4, "c" : 0 }
     { "_id" : "leo", "a" : 2, "b" : 4, "c" : null }

答案 1 :(得分:1)

最后我发现了这个

[
{
    '$project': {
        'a': 1,
        'b': 1,
        'c': 1,
        'c_count': {
            '$cond': [
                {'$gt': ['$c', null]},
                1,
                0
            ]
        }
    }
},
{
    '$group': {
        '_id': '$name',
        'a': {
            '$sum': '$a'
        },
        'b': {
            '$sum': '$b',
        },
        'c': {
            '$sum': '$c'
        },
        'c_count': {
            '$sum': '$c_count'
        }
    }
},
{
    '$project': {
        'a': 1,
        'b': 1,
        'c': {
            '$cond': [
                '$c_count',
                '$c',
                null
            ]
        }
    }
}
]

第一个项目可以找出包含字段c的doc计数, 因为bson-sort-order中的空字段很低。之后,可以在以下管道中挖掘零和0