MongoDB如何将另一集合的指定字段添加到当前集合中
问题原因
你当前使用的聚合语句仅对集合A做了字段投影后写入新集合,全程没有加入和集合B的关联逻辑,自然无法获取到B中的字段,无法达到预期。
前置说明
两个集合做字段合并需要基于共同的关联字段才能完成匹配,以下示例默认假设两个集合通过Name字段关联,如果你的实际关联键不同,替换代码中对应字段名即可。
方案1:生成独立新集合(不修改原有A、B集合
该方案会生成独立的新集合存储合并后的数据,原有A、B集合内容保持不变:
db.A.aggregate([ // 关联集合B,匹配相同关联键的文档 { $lookup: { from: "B", localField: "Name", foreignField: "Name", as: "b_info" } }, // 展开关联结果数组,取匹配到的B集合文档 { $unwind: "$b_info" }, // 拼接A集合原有字段和B集合需要的三个字段 { $project: { _id: 0, Name: 1, School: 1, Class: 1, Rank: 1, FatherName: "$b_info.FatherName", MotherName: "$b_info.MotherName", Location: "$b_info.Location" } }, // 写入新集合 { $merge: { into: "newCollection" } } ])
方案2:直接更新原集合A(无需生成新集合,效率更高)
如果不需要保留合并前A集合的原始状态,可以直接把B的字段直接写入A集合,省去新集合的存储空间开销:
db.A.find().forEach(doc => { // 匹配B集合中对应文档 let matchBDoc = db.B.findOne({Name: doc.Name}); if (matchBDoc) { // // 给A集合追加B的三个字段 db.A.updateOne( {_id: doc._id}, {$set: { FatherName: matchBDoc.FatherName, MotherName: matchBDoc.MotherName, Location: matchBDoc.Location }} ) } })
效率优化提示
两个集合的关联字段提前建立索引后,执行效率会有非常明显的提升。
内容的提问来源于stack exchange,提问作者swarna
相关产品推荐
相关产品推荐

