MongoDB聚合:如何对文档内嵌套数组元素求和?
MongoDB嵌套数组元素求和解决方案
你直接在$group里使用$sum: "$myData"无法得到正确结果,因为$sum只能处理数值类型,而$myData是嵌套数组结构,MongoDB无法直接对其求和。需要先将嵌套数组扁平化,再进行求和操作,具体聚合管道如下:
完整聚合代码
db.collection.aggregate([ // 拆解myData的外层数组,将每个子数组转为单独记录 { $unwind: "$myData" }, // 拆解每个子数组的元素,将单个数值转为单独记录 { $unwind: "$myData" }, // 按id分组,对所有拆解后的数值求和 { $group: { _id: "$id", sumData: { $sum: "$myData" } } }, // 调整输出字段格式,匹配期望结果 { $project: { _id: 0, id: "$_id", sumData: 1 } } ])
各阶段解释
- 第一个
$unwind:将每个文档的myData外层数组拆解,比如id=1的文档会拆分为3条记录,分别对应[2,0,0]、[0,0,0,3,0,0]、[1,0,0,1,0,0,1,0,0]三个子数组。 - 第二个
$unwind:将每条记录中的子数组进一步拆解为单个数值,比如[2,0,0]会拆分为3条分别包含2、0、0的记录,所有嵌套层级的数值都被单独提取。 $group阶段:按id分组,使用$sum对所有拆解后的数值求和,得到每个id对应的总数值。$project阶段:移除默认的_id字段,将分组用的_id重命名为id,保留求和结果sumData,输出格式与你期望的完全一致。
运行上述管道后,会得到如下结果:
[ { "id": 1, "sumData": 8 }, { "id": 2, "sumData": 15 } ]
内容的提问来源于stack exchange,提问作者Carlos RR
相关产品推荐
相关产品推荐

