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
相关产品推荐
相关产品推荐

