MongoDB使用$lookup实现文档集合数据关联至分类文档嵌套children数组的方法
使用MongoDB $lookup实现文档集合与分类集合的嵌套关联
嘿,我来帮你搞定这个嵌套关联的需求!要把document集合里的文档挂到documentCategory对应子分类的children下,咱们得借助MongoDB的聚合管道,结合$lookup、$unwind、$map这些操作来完成,具体实现方案如下:
完整聚合管道代码
db.documentCategory.aggregate([ // 1. 展开父分类的children数组,让每个子分类成为独立文档 { $unwind: { path: "$children", preserveNullAndEmptyArrays: true // 保留没有子分类的父分类 } }, // 2. 关联document集合,匹配子分类ID与文档的分类ID { $lookup: { from: "document", // 要关联的集合 localField: "children._id", // 子分类的ID字段 foreignField: "cid", // document集合中对应的分类ID字段 as: "children.children" // 关联结果存到子分类的children字段 } }, // 3. 转换关联结果格式,只保留文档的name字段 { $set: { "children.children": { $map: { input: "$children.children", as: "doc", in: { name: "$$doc.name" } // 转换成期望的{name: "..."}格式 } } } }, // 4. 重新聚合父分类,恢复嵌套的children数组结构 { $group: { _id: "$_id", name: { $first: "$name" }, pid: { $first: "$pid" }, level: { $first: "$level" }, children: { $push: "$children" } // 把拆分的子分类重新组合成数组 } } ])
步骤拆解说明
- $unwind:把每个父分类的
children数组拆分成多条独立文档,这样才能针对每个子分类单独和document集合做关联。加上preserveNullAndEmptyArrays: true是为了避免那些没有子分类的父分类被过滤掉。 - $lookup:这是核心的关联操作,指定关联的集合是
document,用子分类的_id匹配文档的cid,把匹配到的所有文档放到子分类的children字段里。 - $set + $map:把关联到的原始文档数组转换成你需要的格式——只保留
name字段的对象数组,完美契合你给出的期望结果。 - $group:按父分类的
_id重新分组,把之前拆分的子分类文档重新组合成children数组,同时保留父分类的其他基础字段(name、pid、level),恢复最初的嵌套结构。
这个管道执行后,就能得到你期望的关联结果啦!
内容的提问来源于stack exchange,提问作者laterday
相关产品推荐
相关产品推荐

