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

MongoDB如何访问嵌套数组与对象并实现$sum求和

解决MongoDB中计算每个团队内部积分总和的问题

你的聚合查询存在两个核心问题:

  • _id匹配错误:文档中的_id是ObjectId类型,直接用字符串匹配无法找到目标文档
  • 求和逻辑错误:$sum: "$teams.points"会把所有团队的points数组扁平化后整体求和,无法得到每个团队单独的积分总和

方案1:使用$unwind展开数组后计算(直观易懂)

先通过$unwind将teams数组拆分为单个文档,再对每个文档的points数组求和:

db.users.aggregate([
  // 正确匹配ObjectId类型的_id
  {
    $match: {
      _id: ObjectId("0123456789")
    }
  },
  // 展开teams数组,每个team成为独立文档
  {
    $unwind: "$teams"
  },
  // 计算每个team的points总和
  {
    $addFields: {
      "teams.totalPoints": { $sum: "$teams.points" }
    }
  },
  // 只保留需要的字段,整理成预期格式
  {
    $project: {
      _id: 0,
      teamResult: {
        $concat: [ "$teams.team", "总积分:", { $toString: "$teams.totalPoints" } ]
      }
    }
  }
])

执行后会得到符合预期的结果:

[
  { "teamResult": "Team 1总积分:8" },
  { "teamResult": "Team 2总积分:10" },
  { "teamResult": "Team 3总积分:12" }
]

方案2:使用$map在原文档内计算(无需展开,性能更优)

如果不想拆分文档,可以用$map遍历teams数组,同时计算每个team的积分总和:

db.users.aggregate([
  {
    $match: {
      _id: ObjectId("0123456789")
    }
  },
  {
    $project: {
      _id: 0,
      teamResults: {
        $map: {
          input: "$teams",
          as: "t",
          in: {
            team: "$$t.team",
            totalPoints: { $sum: "$$t.points" }
          }
        }
      }
    }
  }
])

执行后会得到包含每个团队积分详情的结构化结果:

[
  {
    "teamResults": [
      { "team": "Team 1", "totalPoints": 8 },
      { "team": "Team 2", "totalPoints": 10 },
      { "team": "Team 3", "totalPoints": 12 }
    ]
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:30:33