MongoDB聚合$sum返回0而非数组整数总和的问题排查与解决
MongoDB聚合计算数组总和返回0的问题及修复方案
问题背景
原始文档结构如下:
{ "_id": "2023-04-08", "dailyNotes": [ { "therapyDiscipline": "PT", "individual": [60, 45, 30, 75, 55], "concurrent": [69], "coTreat": [67] } ] }
需求:计算individual数组内所有数字的总和,生成仅包含individual键(值为该数组总和)的新文档。
失败的聚合尝试
尝试了以下三种聚合语句,均返回individual: 0的错误结果:
尝试1:$group聚合
{ $group: { _id: '$_id', individual: { $sum: '$dailyNotes.individual' } } }
返回结果:
{ "_id": "2023-04-08", "individual": 0 }
尝试2:$reduce+$project
{ $project: { individual: { $reduce: { input: "$dailyNotes.individual", initialValue: 0, in: { $sum: [ "$$value", "$$this" ]} } } } }
尝试3:直接$sum+$project
{ $project: { individual: { $sum: '$dailyNotes.individual' } } }
更新:多记录场景示例
输入文档包含多条dailyNotes记录:
{ "_id":"2023-04-08", "dailyNotes":[ { "therapyDiscipline":"PT", "individual":[60,45,30,75,55] }, { "therapyDiscipline":"YT", "individual":[2,4] } ] }
期望返回结果:
{ "_id":"2023-04-08", "dailyNotes":[ { "individual":265 }, { "individual":6 } ] }
原因解释
所有尝试返回0的核心原因是:dailyNotes本身是数组,$dailyNotes.individual获取到的是数组的数组(比如单记录场景下是[[60,45,30,75,55]])。
$sum运算符直接处理数组时,会将非数值类型(这里的子数组)视为0,因此总和为0;$reduce的input是数组的数组,遍历过程中$$this代表每个子数组,$sum对数组和数值相加时,同样会把数组当作0处理,最终结果为0。
修复方案
单记录场景
方案1:直接取数组首元素后求和
利用$first提取dailyNotes数组的第一个元素,再对其individual数组求和:
{ $project: { individual: { $sum: { $first: "$dailyNotes.individual" } } } }
方案2:先展开数组再聚合
先用$unwind展开dailyNotes数组,再通过嵌套$sum计算数组总和:
[ { $unwind: "$dailyNotes" }, { $group: { _id: "$_id", individual: { $sum: { $sum: "$dailyNotes.individual" } } } } ]
多记录场景(保留每条dailyNotes的独立总和)
使用$map遍历dailyNotes数组,对每个元素的individual数组单独求和:
{ $project: { dailyNotes: { $map: { input: "$dailyNotes", as: "note", in: { individual: { $sum: "$$note.individual" } } } } } }
内容的提问来源于stack exchange,提问作者Waleed Ahmad
相关产品推荐
相关产品推荐

