为什么这些MongoDB总和不累加?

时间:2018-09-10 20:54:47

标签: mongodb aggregation-framework

假设我有2个文档:

{ 
    "_id" : "8tvgUTKt2U", 
    "answers" : [
        [
            NumberInt(-1)
        ]
    ]
},
{ 
    "_id" : "BDTESUEIlm", 
    "answers" : [
        [
            NumberInt(1)
        ], 
        [
            NumberInt(-1)
        ]
    ]
}

我想对数组项的值求和。但是当我$ unwind'answers'并在$ group管道中$ sum时,我得到了:

{ 
    "_id" : "BDTESUEIlm", 
    "answerTotal" : NumberInt(0)
}
{ 
    "_id" : "8tvgUTKt2U", 
    "answerTotal" : NumberInt(0)
}

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

这是因为当您使用二维数组 $unwind 结束时仅得到一个数组,并且将 $sum 应用于二维数组时,它给出正确的结果 $group 流水线阶段中的数字值,否则,如果所有操作数均为非数字,则默认为0

要解决此问题,您可以在 $sum 管道中使用 $project ,而无需 $unwind ,因为 $sum 遍历数组以对数组的数字元素进行操作,如果表达式解析为数组,则返回单个值。

考虑运行以下管道以获得正确的结果:

db.collection.aggregate([
    { '$project': {
        'answerTotal': {
            '$sum': {
                '$map': {
                    'input': '$answers',
                    'as': 'ans',
                    'in': { '$sum': '$$ans' }
                } 
            }
        }
    } }
])