mongodb 3.x 之实用新功能窥看[2] ——使用$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的模式哦。。。

时间: 2024-08-03 03:07:39

mongodb 3.x 之实用新功能窥看[2] ——使用$lookup做多表关联处理的相关文章

企业邮箱那些实用新功能

邮箱作为老牌互联网产品,经历20年的发展经久不衰,在生活中具有非常广泛的应用,正因为20年的积累,邮箱产品愈发成熟,近几年越来越多的中小企业也开始重视邮箱,纷纷来注册企业邮箱. 2018年最后一个季度已经过半,企业邮箱产品在最后一个Q也有着相当丰富的成果,各家企业邮箱近期都推出了很多新功能,下面小编就带大家来体验几款不错的设计~ 阅后及时焚 很多人听到这个功能是更多想到的是Snapchat这种图片社交软件,而现在邮件也有阅后及焚功能了.这是来自TOM企业邮箱的一款功能,在微信上关注随心邮公众号,

HTML5基本特性和新功能

HTML5的基本特征 1.向前兼容性 核心理念——平滑过渡! 不支持html5的浏览器可以向前兼容,并不会影响web内容的显示! 2.跨平台运行性 从pc浏览器到手机.平板电脑,甚至是智能电视. 只要用户的设备支持HTML5,基于HTML5的web程序就可以无障碍的运行! 3.简单易用性 相对HTML4.01,HTML5更加简单实用. 没有XHTML2.0那样严格的语法规则. (<HTML5的属性精简表示方法可以大大提高html文本的传输效率!> <HTML5 Web Form提供一套强

XenDesktop7.9的新功能:Citrix MCS IO加速浅析

XenDesktop7.9的新功能:CitrixMCS IO加速浅析 一.概述 Citrix XenDesktop 7.9版本中有一个新功能,针对于MCS置备模式的虚拟机存储IO优化技术.该功能可以理解为类似PVS的"缓存在内存并溢出到磁盘"的IO加速技术.简而言之就是在正常读写磁盘的中间,加一个高速的缓存空间,该空间可以是内存空间也可以是SSD硬盘.一切的优化动作都在缓存空间进行,比如IO卸载.IO重排等. Citrix XenDesktop 7.9中,有两个对临时数据进行优化和加速

从淘宝 UWP 的新功能 -- 比较页面来谈谈 UWP 的窗口多开功能

前言 之前在 剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记 这篇随笔中介绍了一下 UWP 淘宝的“比较”新功能呱呱坠地的过程.在鲜活的文字背后,其实都是程序员不眠不休的血泪史(有血有泪有史)……所以我们这次就要在看似好玩的 UWP 多窗口实现背后,挖掘一些我们也是首次接触的干活“新鲜热辣”地放松给大家.希望能使大家在想要将自己的 APP 开新窗口的时候,能从本文中得到一些启发,而不是总是发现 C# 关于 UWP 开新窗口可供参考的文章只有 Is it possible to open

zabbix 3.4新功能值解析——Preprocessing预处理

Zabbix 3.4版本更新了许多新功能,其中一个监控项功能Preprocessing,根据官方说明文档,在监控项收集的数据存储到数据库前,预先对数据进行处理,使用效果超过预期.这个功能存放位置在创建item后多了一个Preprocessing选项卡,截图如下 简单解析下Preprocessing菜单: 转换 描述 Custom multiplier 将值乘以指定的整数或浮点值.使用此选项将以KB,MBps等接收的值转换为B,Bps,否则Zabbix无法正确设置前缀(K,M,G等).从Zabbi

kubernetes微服务扩容与新功能版本的发布

微服务不需要像普通服务那样成为一种独立的功能或者独立的资源.定义中称,微服务是需要与业务能力相匹配,这种说法完全正确.不幸的是,仍然意味着,如果能力模型粒度的设计是错误的,那么,我们就必须付出很多代价.如果你阅读了Fowler的整篇文章,你会发现,其中的指导建议是非常实用的.在决定将所有组件组合到一起时,开发人员需要非常确信这些组件都会有所改变,并且规模也会发生变化.服务粒度越粗,就越难以符合规定原则.服务粒度越细,就越能够灵活地降低变化和负载所带来的影响.然而,利弊之间的权衡过程是非常复杂的,

2012远程桌面管理工具下载新功能

与升级到Windows 8相比,企业用户使用Windows Server 2012时相对比较简单.Windows Server 2012最大的改变并不是在风格上,除了Modern UI界面之外,而是那些基于微软三年前发布Windows Server 2008 第二版本时打造的组件.值得一提的是,Windows Server 2012保留并极大地扩展了两个Windows Server 2008 R2网管们很熟悉的两个管理功能:Server manager 和Powershell.iis7远程桌面连

PyCharm 2019.3发布,增加了哪些新功能呢?

Python的IDE(Integrated Development Environment 集成开发环境)非常多,如:VS Code.Sublime.NotePad.Python自带编辑器IDLE.JuPyter.Eclipse + PyDev等等,但是对于项目开发.管理.部署等稍微大一点的项目,猪哥觉得还是PyCharm最好用! 2019年12月2日,PyCharm迎来了2019.3版本,这也许会是2019年的最后一个大版本,那这个版本增加了哪些新功能呢?我们一起来看看吧! 来源 | PyCh

Atitit.mysql&#160;5.0&#160;5.5&#160;&#160;5.6&#160;5.7&#160;&#160;新特性&#160;新功能

Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能 1. MySQL  5.6    5 大新特性1 1.1. 优化器的改进1 1.2. InnoDB 改进1 1.3. 使用 memcached API 直接访问 NoSQL2 1.4. 更好的复制2 1.5. Performance Schema2 2. MySQL 5.7.62 2.1. 内建中文全文索引2 2.2. 多主复制2 2.3. other2 3. 参考2 1. MySQL  5.6    5 大新特性 M