yewanji 2023-01-30 17:26 采纳率: 36.2%
浏览 51
已结题

mongodb 如何使用$lookup 连接3表查询

假如有这么3张表
1、省份表(test_provinces)

db.test_provinces.insertMany([{
    name:'广东省'
},
{
    name:'广西省'
}
])

2.城市表(test_city)

db.test_city.insertMany([{
    name:'深圳市',
    province_id:ObjectId("63d78a3a07781d41000431aa")
},
{
    name:'广州市',
    province_id:ObjectId("63d78a3a07781d41000431aa")
}
])

3.区域表 (test_district)

db.test_district.insertMany([
    {
    name:'天河区',
    city_id:ObjectId("63d78add07781d41000431ad")
    },
     {
    name:'海珠区',
    city_id:ObjectId("63d78add07781d41000431ad")
    },
    {
    name:'福田区',
    city_id:ObjectId("63d78add07781d41000431ac")
    }
])

重点来了,如何进行连表并返回以下数据格式

{
   name:'广东省',
   city:[{
       name:'深圳市',
       district:[{
            name:'福田区'
       }]
   }]
}
  • 写回答

4条回答 默认 最新

  • m0_54204465 2023-01-30 17:29
    关注

    使用MongoDB的$lookup操作符实现三表的连接查询

    db.test_provinces.aggregate([
      {
        $lookup: {
          from: "test_city",
          localField: "_id",
          foreignField: "province_id",
          as: "city"
        }
      },
      {
        $unwind: "$city"
      },
      {
        $lookup: {
          from: "test_district",
          localField: "city._id",
          foreignField: "city_id",
          as: "city.district"
        }
      },
      {
        $group: {
          _id: "$_id",
          name: {
            $first: "$name"
          },
          city: {
            $push: "$city"
          }
        }
      }
    ])
    
    

    该代码首先使用$lookup操作符连接test_provinces和test_city表,然后使用$unwind操作符拆分新生成的"city"数组,最后再次使用$lookup操作符连接test_district表。最后使用$group操作符分组合并结果,生成期望的数据格式。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 2月9日
  • 已采纳回答 2月1日
  • 创建了问题 1月30日

悬赏问题

  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法