MongoDB聚合无需$unwind和$group实现数组内重复age对应score求和
报错原因
你遇到的报错核心是原有逻辑中$$value是$reduce迭代过程中累计的数组对象,直接访问$$value.score会返回数组类型的结果,无法参与数值运算;同时原有逻辑只做了数组拼接,没有实现「更新已有同age条目分数」的逻辑,不符合需求。
正确聚合语句
db.collection.aggregate([ { $addFields: { data: { $reduce: { input: "$data", initialValue: [], in: { $let: { vars: { // 查找累加数组中是否存在和当前条目age相同的记录 existItem: { $first: { $filter: { input: "$$value", as: "item", cond: { $eq: ["$$item.age", "$$this.age"] } } } } }, in: { $cond: [ // 已存在同age的条目 { $ne: ["$$existItem", null] }, // 遍历累加数组,仅更新同age条目的score,其余字段保持不变 { $map: { input: "$$value", as: "item", in: { $cond: [ { $eq: ["$$item.age", "$$this.age"] }, { first: "$$item.first", second: "$$item.second", age: "$$item.age", score: { $add: ["$$item.score", "$$this.score"] } }, "$$item" ] } } }, // 不存在同age条目,直接追加当前条目到累加数组 { $concatArrays: ["$$value", ["$$this"]] } ] } } } } } } } ])
逻辑说明
- 全程没有用到
$unwind和$group操作符,完全符合要求 - 通过
$reduce遍历原data数组,每次迭代先检查累加数组中是否已存在相同age的条目 - 存在同
age条目时仅更新对应的score求和结果,first、second等其余字段完全保留 - 不存在同
age条目时直接追加当前条目到累加数组,最终输出的结构和你要求的预期结果完全一致
内容的提问来源于stack exchange,提问作者Jahanzaib Khan
相关产品推荐
相关产品推荐

