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

