You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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" }
    }
  }
])

步骤说明

  1. $unwind 外层数组:先把每个文档的a.nodes数组展开,这样能分离出包含b的元素和包含c.nodes的元素。
  2. 分组提取核心数据:按原始文档的_id分组,用$first提取唯一的b值(缺失则设为0),用$push收集c.nodes数组。
  3. 展开内层数组:连续两次$unwind,把嵌套的c.nodes数组完全展开,让每个d和e字段成为独立的文档元素。
  4. 分组聚合d和e:再次按原始ID分组,用$sum收集d和e的值(缺失则补0),确保每个文档能拿到完整的d、e数值。
  5. 计算单文档乘积:用$multiply计算b*d*e的结果。
  6. 求和所有结果:最后按统一的_id: null分组,用$sum得到所有文档乘积的总和。

结果验证

  • 第一个文档:1 * 2 * 2 = 4
  • 第二个文档:4 * 0 * 9 = 0
  • 总和:4 + 0 = 4,完全符合你的预期。

如果要泛化到任意层级的嵌套nodes数组,MongoDB 3.2的聚合能力会有局限(没有递归操作支持),但针对当前的数据结构,这个方案是稳定可行的。

内容的提问来源于stack exchange,提问作者daemon24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:53:44