如何合并MongoDB两个集合并将关联结果转为非数组格式?
解决MongoDB两个集合关联后合并字段的问题
集合结构
Name集合文档结构
{ "First_Name" : "Smith", "Last_Name": "Smiths" }
Information集合文档结构
{ "Last_Name": "Smiths", "Address": "Some street" }
你当前用$lookup关联后,返回的关联数据是数组格式,要把Address字段直接合并到主文档里,可采用以下几种方案:
方案1:$unwind + $replaceRoot(通用版本)
先关联集合,展开数组后合并文档字段:
db.Name.aggregate([ { $lookup: { from: "Information", localField: "Last_Name", foreignField: "Last_Name", as: "info" } }, { $unwind: "$info" }, { $replaceRoot: { newRoot: { $mergeObjects: ["$$ROOT", "$info"] } } }, { $unset: "info" } ])
方案2:$arrayElemAt + $mergeObjects(简洁版本)
直接取出数组第一个元素,再与主文档合并:
db.Name.aggregate([ { $lookup: { from: "Information", localField: "Last_Name", foreignField: "Last_Name", as: "info" } }, { $addFields: { info: { $arrayElemAt: ["$info", 0] } } }, { $replaceRoot: { newRoot: { $mergeObjects: ["$$ROOT", "$info"] } } }, { $unset: "info" } ])
方案3:MongoDB 5.0+简化写法
在$lookup的管道内提前处理数据,减少聚合阶段:
db.Name.aggregate([ { $lookup: { from: "Information", let: { lastName: "$Last_Name" }, pipeline: [ { $match: { $expr: { $eq: ["$Last_Name", "$$lastName"] } } }, { $project: { _id: 0, Last_Name: 0 } } ], as: "info" } }, { $replaceRoot: { newRoot: { $mergeObjects: ["$$ROOT", { $arrayElemAt: ["$info", 0] }] } } }, { $unset: "info" } ])
以上方案执行后,都会返回你期望的格式:
{ "First_Name" : "Smith", "Last_Name": "Smiths", "Address": "Some street" }
内容的提问来源于stack exchange,提问作者Na el
相关产品推荐
相关产品推荐

