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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:01:00