MongoDB——聚合管道之$lookup操作

一、$lookup的概述

  • Mongodb 3.2版本新增,主要用来实现多表关联查询, 相当关系型数据库中多表关联查询。
  • 每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组(可根据需要命名新key )。数组列存放的数据是来自被Join集合的适配文档,如果没有,集合为空(即 为[ ])

二、$lookup的语法

  • $lookup的语法

    db.collection.aggregate([{ 
    	$lookup: { 
    		from: "<collection to join>",
     		localField: "<field from the input documents>", 
     		foreignField: "<field from the documents of the from collection>", 
     		as: "<output array field>" 
     	} 
    })
    
  • $lookup的解释

    属性作用
    from同一个数据库下等待被Join的集合。
    localField源集合中的match值,如果输入的集合中,某文档没有 localField这个Key(Field),在处理的过程中,会默认为此文档含有 localField:null的键值对。
    foreignField待Join的集合的match值,如果待Join的集合中,文档没有foreignField值,在处理的过程中,会默认为此文档含有 foreignField:null的键值对。
    as为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉
  • $lookup语法的图解
    在这里插入图片描述

三、数据准备

  • 新增客户表数据

    db.customer.insert(
    {customerCode:1,name:"customer1",phone:"13112345678",address: "test1"}
    ) 
    db.customer.insert(
    {customerCode:2,name:"customer2",phone:"13112345679",address: "test2"}
    )
    
  • 新增订单表数据

    db.order.insert(
    {orderId:1,orderCode:"order001",customerCode:1,price:200}
    ) 
    db.order.insert(
    {orderId:2,orderCode:"order002",customerCode:2,price:400}
    )
    
  • 新增订单详情表数据

    db.orderItem.insert({itemId:1,productName:"apples",qutity:2,orderId:1}) 
    db.orderItem.insert({itemId:2,productName:"oranges",qutity:2,orderId:1})
    db.orderItem.insert({itemId:3,productName:"mangoes",qutity:2,orderId:1}) 
    db.orderItem.insert({itemId:4,productName:"apples",qutity:2,orderId:2}) 
    db.orderItem.insert({itemId:5,productName:"oranges",qutity:2,orderId:2})
    db.orderItem.insert({itemId:6,productName:"mangoes",qutity:2,orderId:2})
    

四、关联查询示例

  • 根据customerCode关联查询客户表和订单表信息

    db.customer.aggregate([ 
    	{$lookup: { 
    		from: "order", 
    		localField: "customerCode", 
    		foreignField: "customerCode", 
    		as: "customerOrder" 
    		}
    	} 
    ]).pretty()
    

    在这里插入图片描述

  • 根据customerCode关联查询订单表和客户表信息,并且根据orderId查询订单表和订单详情表信息。

    db.order.aggregate([ 
    	{$lookup: { 
    		from: "customer", 
    		localField: "customerCode", 
    		foreignField: "customerCode", 
    		as: "curstomer" 
    		}
    	},
    	{$lookup: {
    		from: "orderItem", 
    		localField: "orderId", 
    		foreignField: "orderId", 
    		as: "orderItem" 
    		} 
    	}
    ])
    

    在这里插入图片描述
    在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小志的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值