You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:52:17