MongoDB按ID合并对象数组:补全关联人员名称字段
解决方案
你可以在现有聚合管道的基础上,通过$map、$filter和$mergeObjects操作合并两个数组的内容,最终得到期望的结果:
db.people.aggregate([ // 可选:添加$match过滤需要的文档 // { $match: { /** ... */ }, }, { $lookup: { from: "people", let: { relatedPeopleIds: "$relatedPeople.id" }, pipeline: [ { $match: { $expr: { $in: ["$id", "$$relatedPeopleIds"] } } }, { $project: { id: 1, name: 1, }, }, ], as: "relatedPeople2", }, }, // 合并relatedPeople和relatedPeople2的内容 { $addFields: { relatedPeople: { $map: { input: "$relatedPeople", as: "rp", in: { $mergeObjects: [ "$$rp", // 保留原有的id和relation字段 // 从relatedPeople2中匹配对应id的name字段 { $first: { $filter: { input: "$relatedPeople2", cond: { $eq: ["$$this.id", "$$rp.id"] } } } } ] } } } } }, // 只保留需要的字段,移除临时的relatedPeople2 { $project: { _id: 1, id: 1, name: 1, relatedPeople: 1 } } ]);
步骤说明
- $lookup阶段:从
people集合中查询当前文档relatedPeople数组里所有id对应的人员,仅提取id和name字段,存入临时字段relatedPeople2。 - $addFields阶段:
- 用
$map遍历原relatedPeople数组的每个元素; - 对每个元素,通过
$filter在relatedPeople2中找到id匹配的对象,$first确保只取匹配到的第一个结果(这里每个id唯一,所以只会有一个); - 用
$mergeObjects将原元素的id、relation字段和匹配到的name字段合并,替换原来的relatedPeople字段。
- 用
- $project阶段:仅保留需要的
_id、id、name和合并后的relatedPeople字段,移除临时的relatedPeople2。
这个方案会自动处理relatedPeople为空数组的情况,此时$map会返回空数组,符合你的需求。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

