【MongoDB】使用$lookup做多表关联处理
这篇我们来看mongodb另一个非常有意思的东西,那就是$lookup,我们知道mongodb是一个文档型的数据库,而且它也是最像关系型数据库的一种nosql,但是呢,既然mongodb是无模式的,自然就很难在关系型数据库中非常擅长的多表关联上发挥作用,在这之前,我们可以使用DbRef,但是呢,在mongodb 3.2 中给你增加了一个相当牛逼的手段,那就是$lookup,而且放到了aggreation这种重量级的pipeline分析框架上,自然就是一等公民了,牛逼哈~。
一:介绍Aggregate
这个aggregate在mongodb中算是一个非常重量级的工具了,而且pipeline的管道模型的理论就是后面操作的数据源来源于上一次操作的结果,这个应该很好理解吧,好了,下面我们简单看看aggreation中到底有哪几个一等公民。
很简单,就是上面的这十三个,比如说有了所谓的$group操作,我们就可以把这个aggreation做group的处理,有了$sort操作,就可以将结果进行排序,有了$out操作,我们就可以将结果放到一个collections中去或者inline模式展示。。。
1. $lookup
说了这么多,下面我们简单的来演示一下,比如我们有一个product表,有一个orders表,自然就存在着一个外键关系,下面我们就来造点数据。
db.product.insert({"_id":1,"productname":"商品1","price":15})
db.product.insert({"_id":2,"productname":"商品2","price":36})db.orders.insert({"_id":1,"pid":1,"ordername":"订单1"})
db.orders.insert({"_id":2,"pid":2,"ordername":"订单2"})
db.orders.insert({"_id":3,"pid":2,"ordername":"订单3"})
db.orders.insert({"_id":4,"pid":1,"ordername":"订单4"})db.product.find()
db.orders.find()
好了,数据已经构造完毕,接下来我们要做的一个小需求就是,在orders表中,找到price of product >20 的订单,这个需求看起来很简单,对吧,但是呢,我们的orders表中是没有price的field的,所以第一步就是:
<1> $lookup 表关联
1 db.product.aggregate([2 {3 $lookup:4 {5 from: "orders",6 localField: "_id",7 foreignField: "pid",8 as: "inventory_docs"9 }
10 }
11 ])
然后展示的结果如下:
1 /* 1 */2 {3 "_id" : 1.0,4 "productname" : "商品1",5 "price" : 15.0,6 "inventory_docs" : [ 7 {8 "_id" : 1.0,9 "pid" : 1.0,
10 "ordername" : "订单1"
11 },
12 {
13 "_id" : 4.0,
14 "pid" : 1.0,
15 "ordername" : "订单4"
16 }
17 ]
18 }
19
20 /* 2 */
21 {
22 "_id" : 2.0,
23 "productname" : "商品2",
24 "price" : 36.0,
25 "inventory_docs" : [
26 {
27 "_id" : 2.0,
28 "pid" : 2.0,
29 "ordername" : "订单2"
30 },
31 {
32 "_id" : 3.0,
33 "pid" : 2.0,
34 "ordername" : "订单3"
35 }
36 ]
37 }
最后我放一张图,这样好眼见为实:
下面我简单介绍一些$lookup中的参数:
from:需要关联的表【orders】
localField: 【product】表需要关联的键。
foreignField:【orders】的matching key。
as: 对应的外键集合的数据,【因为可能是一对多的,对吧】
好了,表关联已经做好了,接下来我们就需要用另外一个关键词叫做$match,where条件的意思嘛。。。
<2> $match筛选
1 db.product.aggregate([2 {3 $lookup:4 {5 from: "orders",6 localField: "_id",7 foreignField: "pid",8 as: "inventory_docs"9 }
10 },
11 { $match : { price : {$gt:20} } }
12 ])
果然不出所料,我们就把”商品1“过滤掉了,因为它的价格小于20,对吧,但是呢,看起来还不是很完美,应为我只需要orders信息,并不想要所谓的product 这些属性,这个时候我们就可以使用$project 做select操作了。。。
<3> $project 挑选字段
接下来我们使用$project来指定我要获取的字段,比如我只需要inventory_docs字段就可以了。
ok,当我执行之后,现在是这个吊样子了,这个就是本篇所说的,是不是很简单,同时呢,我也给大家简单的介绍了下Aggreation的使用,是不是很好玩,当然Aggregate下面还有其他很多的$操作符,你可以按照要求试试看哦~ 记得这个可是pipeline的模式哦。。。
本文转载自:https://www.cnblogs.com/huangxincheng/p/5728791.html
【MongoDB】使用$lookup做多表关联处理相关推荐
- mysql lookup3_mongodb 3.x 之实用新功能窥看[2] ——使用$lookup做多表关联处理
这篇我们来看mongodb另一个非常有意思的东西,那就是$lookup,我们知道mongodb是一个文档型的数据库,而且它也是最像关系型数据库的 一种nosql,但是呢,既然mongodb是无模式的, ...
- MongoDB中的聚合管道($lookup多表关联查询、$unwind、$match、$project)
MongoDB中的聚合管道($lookup多表关联查询.$unwind.$match.$project) 管道的概念 聚合框架 $lookup的功能及语法 主要功能 基本语法 例子 说明 $unwin ...
- MongoDB之多表关联查询
最近在看同事代码的时候,注意到了$lookup多表关联查询,不太清楚类比MySQL中是哪种连接查询,因此就有了此次的测试总结.接下来,我会用测试结果来介绍MySQL中的内连接.左外连接.右外连接,介绍 ...
- jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询
上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询.但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加 ...
- 放弃vlookup吧,这3种EXCEL多表关联方法“强得很”
相信很多人对Excel都是又爱又恨的,这个我们日常工作中频繁用到的工具,功能虽然强大,但缺点也很明显.如在性能方面,当数据量较大时Excel运行就会变得非常缓慢,严重降低了工作效率.在讨论如何解决这个 ...
- java mongodb 多表关联查询,多条件查询,分页,排序
前言: 由于最近项目赶,版本迭代快,不知道大BOSS从哪里听别人说MongoDB用来做关系型数据库好,而且速度快,性能高:听到这话的我,立马就反驳了回去:"MongoDB不支持事物" ...
- mongodb $lookup 联表查询
collection orders : orders record example collection items :items record example $lookup 联表 ...
- MongoDB的多表关联查询
Mongoose的多表关联查询 首先,我们回忆一下,MySQL多表关联查询的语句: student表: calss表: 通过student的classId关联进行查询学生名称,班级的数据: SELEC ...
- 数据库中各表关联图及其说明_如何在图中思考:图论及其应用的说明性介绍
数据库中各表关联图及其说明 by Vardan Grigoryan (vardanator) 由Vardan Grigoryan(vardanator) 如何在图中思考:图论及其应用的说明性介绍 (H ...
- 22、UPDATE多表关联更新
MySQL 可以基于多表查询更新数据.对于多表的 UPDATE 操作需要慎重,建议在更新前,先使用 SELECT 语句查询验证更新的数据与自己期望的是否一致. 下面我们建两张表,一张表为 produc ...
最新文章
- 通过AI技术研究网红对其粉丝的消费品牌意识的影响
- 详解虚函数的实现过程之初探虚表(1)
- 竞价点击软件_百度的关键词竞价广告:百度竞价广告关键词怎么设置?28法则是什么?...
- Linux shell脚本启动 停止 重启jar包
- jQuery attributes(上)
- pytorch 优化器调参
- kotlin 运算符_Kotlin属性,数据类型,运算符
- 一不小心就进入了P2P陷阱
- a blog about grid stytem
- pyqt5制作定时关机软件
- 使用IDEA工具配置和运行vue项目(详细其中的坑)
- Openbravo中文使用手册
- WEB客户端编程与服务器端编程
- 图解:什么是二叉堆?
- Mac上如何提取图片上的文字?
- 关于修改windows文件夹图标
- 2019 秋招前端面试总结
- 个人博客文章网站搭建自适应模板
- lcd屏幕显示bmp、jpg图片
- robots机器人疾风 war_不正经评测之:《战争机器人War Robots》
热门文章
- 武汉财贸学校2020计算机应用,2021年武汉市财贸学校招生简章
- 学习C语言的心路历程
- Flowable Modeler
- aid learning如何换源
- 使用Kotlin语言两年后,我有话要说
- 汽车“新四化”,如何扬长避短?
- python 安卓平板摄像头_python把手机摄像头当作电脑摄像头
- VSCode 中常用的 PHP 编程插件
- 苹果微信更新不了最新版本_微信登录不了,微信提示版本过低,请升级最新版本的解决办法...
- 京东开源组件库NutUI 3.1 正式发布:开启多端开发之路