MongoDB聚合查询:关联数组中子字段并保留level字段
解决MongoDB聚合中关联嵌套数组并保留字段结构的问题
你的问题核心是直接使用$lookup关联嵌套数组内的字段时,会破坏原有数组结构,丢失level与关联文档的对应关系。正确做法是先拆分数组,关联后再重组,具体聚合流程如下:
完整聚合语句
[ // 拆分skills数组,将每个skill项转为独立文档 { $unwind: "$skills" }, // 关联Skill集合,替换skills.skill为对应的文档 { $lookup: { from: "Skill", localField: "skills.skill", foreignField: "_id", as: "skills.skill" } }, // 将lookup返回的数组转为单个文档对象 { $set: { "skills.skill": { $first: "$skills.skill" } } }, // 按用户ID重组文档,恢复skills数组结构 { $group: { _id: "$_id", // 保留用户其他原始字段,用$first取原始值 otherProperties: { $first: "$otherProperties" }, skills: { $push: "$skills" } } } ]
各阶段说明
$unwind: "$skills"
将用户文档中的skills数组拆分为多个文档,每个文档仅包含一个skills对象(含原skill和level字段),确保后续$lookup能精准关联单个skill项。$lookup
此时localField指向拆分后的单个skills.skillObjectId,关联Skill集合后,匹配的文档数组会存入skills.skill字段。$set: { "skills.skill": { $first: "$skills.skill" } }
由于$lookup默认返回数组(即使仅一个匹配项),用$first取出数组首个元素,将skills.skill转为单个文档对象,契合预期结构。$group
按用户_id分组,把处理后的skills对象重新push为数组,同时用$first保留用户其他原始字段(示例中otherProperties需替换为你的真实字段)。
执行以上聚合后,即可得到目标结果:每个skills项既包含关联后的完整Skill文档,又保留了对应的level字段。
内容的提问来源于stack exchange,提问作者Sohayb Saleh
相关产品推荐
相关产品推荐

