目录
一、$lookup的概述
- 一、$lookup的概述
- 二、$lookup的语法
- 三、数据准备
- 四、关联查询示例
- Mongodb 3.2版本新增,主要用来实现多表关联查询, 相当关系型数据库中多表关联查询。
- 每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组(可根据需要命名新key )。数组列存放的数据是来自被Join集合的适配文档,如果没有,集合为空(即 为[ ])
-
$lookup的语法
db.collection.aggregate([{ $lookup: { from: "", localField: "", foreignField: "", as: "" } })
-
$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" } } ])