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

MongoDB中使用Lookup关联3个集合并实现嵌套结构

MongoDB 三个集合嵌套关联实现方案

没问题,我来帮你搞定MongoDB三个集合的嵌套关联需求!根据你给出的opera和orders集合示例,我先补充一个合理的第三层集合(比如订单项集合order_items),然后用嵌套的$lookup操作实现子集合嵌套到父对象的效果。

示例集合数据

首先确认三个集合的测试数据:

1. opera集合

db.opera.insert([ 
  { "tlocal" : 1, "name" : "A" }, 
  { "tlocal" : 2, "name" : "B"} 
])

2. orders集合

db.orders.insert([ 
  { "olocal" : 1, "name" : "ABC", "tlocal": 1}, 
  { "olocal" : 2, "name" : "DEF", "tlocal": 1}, 
  { "olocal" : 3, "name" : "LMN", "tlocal": 2}, 
  { "olocal" : 4, "name" : "OPY", "tlocal": 2} 
])

3. order_items集合(补充的第三层集合)

db.order_items.insert([
  { "item_id": 1, "product": "Apple", "quantity": 2, "olocal": 1 },
  { "item_id": 2, "product": "Banana", "quantity": 3, "olocal": 1 },
  { "item_id": 3, "product": "Orange", "quantity": 1, "olocal": 2 },
  { "item_id": 4, "product": "Grape", "quantity": 5, "olocal": 3 },
  { "item_id": 5, "product": "Mango", "quantity": 2, "olocal": 4 }
])

嵌套关联聚合查询

我们需要通过**嵌套管道式$lookup**来实现三层数据的嵌套,具体查询语句如下:

db.opera.aggregate([
  {
    // 第一层关联:将opera与orders通过tlocal字段关联
    $lookup: {
      from: "orders",
      localField: "tlocal",
      foreignField: "tlocal",
      as: "orders",
      // 在orders的关联结果中,嵌套执行第二层关联
      pipeline: [
        {
          // 第二层关联:将每个订单与order_items通过olocal字段关联
          $lookup: {
            from: "order_items",
            localField: "olocal",
            foreignField: "olocal",
            as: "items"
          }
        },
        // 过滤订单文档中不需要的字段(可选)
        {
          $project: {
            _id: 0,
            olocal: 1,
            name: 1,
            items: 1
          }
        }
      ]
    }
  },
  // 过滤opera文档中不需要的字段(可选)
  {
    $project: {
      _id: 0,
      tlocal: 1,
      name: 1,
      orders: 1
    }
  }
])

查询结果说明

执行上述聚合后,每个opera文档会包含嵌套的orders数组,每个订单又包含嵌套的items数组,最终结果如下:

[
  {
    "tlocal": 1,
    "name": "A",
    "orders": [
      {
        "olocal": 1,
        "name": "ABC",
        "items": [
          { "item_id": 1, "product": "Apple", "quantity": 2, "olocal": 1 },
          { "item_id": 2, "product": "Banana", "quantity": 3, "olocal": 1 }
        ]
      },
      {
        "olocal": 2,
        "name": "DEF",
        "items": [
          { "item_id": 3, "product": "Orange", "quantity": 1, "olocal": 2 }
        ]
      }
    ]
  },
  {
    "tlocal": 2,
    "name": "B",
    "orders": [
      {
        "olocal": 3,
        "name": "LMN",
        "items": [
          { "item_id": 4, "product": "Grape", "quantity": 5, "olocal": 3 }
        ]
      },
      {
        "olocal": 4,
        "name": "OPY",
        "items": [
          { "item_id": 5, "product": "Mango", "quantity": 2, "olocal": 4 }
        ]
      }
    ]
  }
]

灵活调整说明

如果你的第三个集合不是order_items,只需要修改以下参数即可:

  • $lookup中的from值改为你的集合名
  • localField和foreignField改为对应的关联字段
  • as值改为你想要的嵌套字段名

内容的提问来源于stack exchange,提问作者Sunil Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:59:34