MongoDB聚合查询:将集合b的积分汇总更新至集合a
解决方案
可以利用MongoDB 4.2及以上版本支持的更新管道,结合聚合操作完成需求,具体语句如下:
db.a.updateMany( {}, [ { $lookup: { from: "b", let: { aToken: "$token" }, pipeline: [ { $unwind: "$lines" }, { $match: { $expr: { $eq: ["$lines.token", "$$aToken"] } } }, { $group: { _id: null, totalPoints: { $sum: "$lines.points" } } }, { $project: { totalPoints: 1, _id: 0 } } ], as: "bData" } }, { $set: { points: { $ifNull: [{ $arrayElemAt: ["$bData.totalPoints", 0] }, 0] } } }, { $unset: "bData" } ] )
语句说明:
$lookup:关联集合b,通过当前a文档的token匹配b中lines数组内的对应token$unwind:将b中的lines数组拆分为单个文档,便于后续聚合计算$match:筛选出与当前a文档token匹配的lines元素$group:对筛选后的points求和,得到该token的总积分$set:把汇总后的积分赋值给a文档的points字段;若该token在b中无对应数据,则保持points为初始值0$unset:清理临时生成的bData字段
若你的MongoDB版本低于4.2,可先聚合集合b得到每个token的积分汇总,再批量更新集合a:
// 先聚合b得到token的积分汇总结果 const pointSummaries = db.b.aggregate([ { $unwind: "$lines" }, { $group: { _id: "$lines.token", totalPoints: { $sum: "$lines.points" } } } ]).toArray(); // 循环执行更新操作 pointSummaries.forEach(item => { db.a.updateOne( { token: item._id }, { $set: { points: item.totalPoints } } ); });
内容的提问来源于stack exchange,提问作者bullbazour
相关产品推荐
相关产品推荐

