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 到具有管道语法和 _id 作为字符串的父数组字段
MongoDB——聚合管道之$limit&$skip&$sort操作