MongoDB 3.2嵌套数组元素算术运算聚合查询求助
MongoDB 3.2嵌套数组字段乘积求和解决方案
针对你提出的需求——计算嵌套数组中指定字段的乘积之和,且缺失字段按0处理,我整理了一套适配MongoDB 3.2版本的聚合管道方案,能得到你期望的结果4。
完整聚合管道代码
db.collection.aggregate([ // 展开最外层的a.nodes数组 { $unwind: "$a.nodes" }, // 按原始文档ID分组,提取b值和c.nodes数组 { $group: { _id: "$_id", b: { $first: { $ifNull: ["$a.nodes.b", 0] } }, cNodes: { $push: "$a.nodes.c.nodes" } } }, // 展开cNodes数组(此时cNodes是包含内层nodes的数组) { $unwind: "$cNodes" }, // 展开内层的c.nodes数组 { $unwind: "$cNodes" }, // 再次按原始ID分组,提取d和e的值(缺失则为0) { $group: { _id: "$_id", b: { $first: "$b" }, d: { $sum: { $ifNull: ["$cNodes.d", 0] } }, e: { $sum: { $ifNull: ["$cNodes.e", 0] } } } }, // 计算单个文档的乘积 { $project: { product: { $multiply: ["$b", "$d", "$e"] } } }, // 求和所有文档的乘积 { $group: { _id: null, totalSum: { $sum: "$product" } } } ])
步骤说明
- $unwind 外层数组:先把每个文档的
a.nodes数组展开,这样能分离出包含b的元素和包含c.nodes的元素。 - 分组提取核心数据:按原始文档的
_id分组,用$first提取唯一的b值(缺失则设为0),用$push收集c.nodes数组。 - 展开内层数组:连续两次
$unwind,把嵌套的c.nodes数组完全展开,让每个d和e字段成为独立的文档元素。 - 分组聚合d和e:再次按原始ID分组,用
$sum收集d和e的值(缺失则补0),确保每个文档能拿到完整的d、e数值。 - 计算单文档乘积:用
$multiply计算b*d*e的结果。 - 求和所有结果:最后按统一的
_id: null分组,用$sum得到所有文档乘积的总和。
结果验证
- 第一个文档:
1 * 2 * 2 = 4 - 第二个文档:
4 * 0 * 9 = 0 - 总和:
4 + 0 = 4,完全符合你的预期。
如果要泛化到任意层级的嵌套nodes数组,MongoDB 3.2的聚合能力会有局限(没有递归操作支持),但针对当前的数据结构,这个方案是稳定可行的。
内容的提问来源于stack exchange,提问作者daemon24
相关产品推荐
相关产品推荐

