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

如何将MongoDB plans集合名称替换为users集合ID并保存结果

如何将聚合查询结果更新回MongoDB的plans集合?

你可以在聚合管道末尾添加$merge阶段,直接把处理后的结果更新回原plans集合,这是安全高效的方式。

完整的更新聚合查询

db.plans.aggregate([
  {
    $lookup: {
      from: "users",
      localField: "person",
      foreignField: "name",
      as: "person"
    }
  },
  {
    $lookup: {
      from: "users",
      localField: "place",
      foreignField: "name",
      as: "place"
    }
  },
  {
    $unwind: {
      path: "$person"
    }
  },
  {
    $unwind: {
      path: "$place"
    }
  },
  {
    $set: {
      "person": "$person.id",
      "place": "$place.id" // 注意去掉原查询里多余的逗号,避免语法错误
    }
  },
  // 添加$merge阶段合并结果回原集合
  {
    $merge: {
      into: "plans", // 目标集合
      on: "_id", // 用_id匹配对应文档
      whenMatched: "replace", // 匹配到文档时直接替换为处理后的版本
      whenNotMatched: "discard" // 未匹配到的文档直接丢弃
    }
  }
])

关键说明

  • $merge只会更新匹配到的文档,保留集合中未被处理的其他文档,比$out更安全($out会直接替换整个集合,风险极高)。
  • 确保users集合中每个name对应唯一文档,否则$unwind可能生成重复文档。如果有需要,可以在$lookup后添加$match阶段,过滤掉person或place为空数组的无效数据。

验证结果

运行上述聚合后,查询目标文档:

db.plans.find({_id: "aeaab905-2d8b-4e26-9244-918956496c35"})

将得到你期望的输出:

{
  "_id": "aeaab905-2d8b-4e26-9244-918956496c35",
  "id": "aeaab905-2d8b-4e26-9244-918956496c35",
  "person": "a7609095-869e-4800-9fac-fefc373c37a5",
  "place": "2bd8f68d-721a-4106-bd7f-951236c3593d"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:00:55