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

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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" 
    		 
    	
    ])
    


以上是关于MongoDB——聚合管道之$lookup操作的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb 聚合管道限制 $lookup 字段

MongoDB 聚合 $lookup 到具有管道语法和 _id 作为字符串的父数组字段

MongoDB——聚合管道之$limit&$skip&$sort操作

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

MongoDB 聚合管道(Aggregation Pipeline)

MongoDB——聚合管道之$match和$count操作