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

x33g5p2x  于2022-04-25 转载在 其他  
字(2.2k)|赞(0)|评价(0)|浏览(422)

一、$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" 
		} 
	}
])

阅读世界,共赴山海

423全民读书节,邀你共读

相关文章