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

MongoDB复杂聚合:关联Schema并实现数组及总计计算

MongoDB聚合实现方案

直接用$map处理数组元素,避免$unwind后再重组的麻烦,完整聚合管道如下:

db.b.aggregate([
  // 关联Schema a,获取academic_year
  {
    $lookup: {
      from: "a",
      localField: "b4",
      foreignField: "_id",
      as: "a_data"
    }
  },
  // 提取academic_year并给b3数组元素添加total字段
  {
    $addFields: {
      academic_year: { $arrayElemAt: ["$a_data.academic_year", 0] },
      b3: {
        $map: {
          input: "$b3",
          as: "item",
          in: {
            b3_1: "$$item.b3_1",
            b3_2: "$$item.b3_2",
            b3_3: "$$item.b3_3",
            total: { $add: ["$$item.b3_1", "$$item.b3_2", "$$item.b3_3"] }
          }
        }
      }
    }
  },
  // 计算BigTotal:b1 + b2 + 所有b3元素的total之和
  {
    $addFields: {
      BigTotal: {
        $add: [
          "$b1",
          "$b2",
          {
            $sum: {
              $map: {
                input: "$b3",
                as: "item",
                in: "$$item.total"
              }
            }
          }
        ]
      }
    }
  },
  // 移除冗余字段(可选)
  {
    $project: {
      a_data: 0,
      b4: 0
    }
  }
])

步骤说明:

  • $lookup:将b集合的b4字段与a集合的_id关联,拉取对应的学年数据。
  • 第一个$addFields:用$arrayElemAt提取关联后的学年值;用$map遍历b3数组,给每个元素新增total字段(为三个子字段的和)。
  • 第二个$addFields:先通过$map提取所有b3元素的total值,再用$sum求和,最后加上b1和b2得到BigTotal。
  • $project:移除关联产生的临时数组a_data和原b4字段,让结果结构更简洁。

这个方案全程无需拆分数组,直接在数组层面完成计算,避免了$unwind后重组的复杂操作,效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:45:39