假设我有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)
}
我在做什么错了?
答案 0 :(得分:1)
这是因为当您使用二维数组 $unwind
结束时仅得到一个数组,并且将 $sum
应用于二维数组时,它给出正确的结果 $group
流水线阶段中的数字值,否则,如果所有操作数均为非数字,则默认为0
。
要解决此问题,您可以在 $sum
管道中使用 $project
,而无需 $unwind
,因为 $sum
遍历数组以对数组的数字元素进行操作,如果表达式解析为数组,则返回单个值。
考虑运行以下管道以获得正确的结果:
db.collection.aggregate([
{ '$project': {
'answerTotal': {
'$sum': {
'$map': {
'input': '$answers',
'as': 'ans',
'in': { '$sum': '$$ans' }
}
}
}
} }
])