mysql mongo关联查询语句_MongoDB 集合间关联查询后通过$filter进行筛选

在前面的分享中,有讲解 “详解MongoDB中的多表关联查询($lookup)” 一节,其内容涵盖了常见的集合管理的需求。我们知道文档的选择都是通过$match进行匹配刷选。但这是文档间的匹配筛选,并没有对单个新生成的文档进行内嵌子文档进行筛选。

那么什么是$lookup后新文档的内嵌子文档呢?

假设有以下2个集合,一个是商品库存集合inventory,存储的测试数据 如下:

db.inventory.insert([{ "_id" : 1, "sku" : "almonds", product: "product 1", "instock" : 120 },

{ "_id" : 2, "sku" : "bread1", product: "product 2", "instock" : 80 },

{ "_id" : 3, "sku" : "bread2", product: "product 2", "instock" : 80 },

{ "_id" : 4, "sku" : "pecans1", product: "product 4", "instock" : 70 },

{ "_id" : 5, "sku" : "pecans2", product: "product 4", "instock" : 70 },])

一个是商品对应的原料集合product,存储的测试数据,如下。

db.product.insert([{ "_id" : 1, product: "product 1", description: "金玉满堂1" },

{ "_id" : 2, product: "product 2", description: "招财进宝"},

{ "_id" : 3, product: "product 4", description: "杨柳依依"},])

两个集合都包含有product字段,如果 需求是按原料名称统计每个原料对应的商品情况。

可以根据字段product进行集合关联,并且product集合的文档与inventory 集合的文档是 一对多 的关系。

执行关联脚本查询的脚本如下:

db.product.aggregate([{

$lookup:

{

from: "inventory",

localField: "product",

foreignField: "product",

as: "inventory_docs"

}

}])

新生成的聚合集合的文档如下:

/*1*/{

"_id" :1,

"product" : "product1",

"description" : "金玉满堂1",

"inventory_docs" :[{

"_id" : 1,

"sku" : "almonds",

"product" : "product 1",

"instock" : 120,

"state" : "OK"

}]},/*2*/{

"_id" :2,

"product" : "product2",

"description" : "招财进宝",

"inventory_docs" :[{

"_id" : 2,

"sku" : "bread1",

"product" : "product 2",

"instock" : 80,

"state" : "OK"

},

{

"_id" : 3,

"sku" : "bread2",

"product" : "product 2",

"instock" : 80,

"state" : "Simple"

}]},/*3*/{

"_id" :3,

"product" : "product4",

"description" : "杨柳依依",

"inventory_docs" :[{

"_id" : 4,

"sku" : "pecans1",

"product" : "product 4",

"instock" : 70,

"state" : "OK"

},

{

"_id" : 5,

"sku" : "pecans2",

"product" : "product 4",

"instock" : 70,

"state" : "Simple"

}]}

从返回结果可以看出,

(1) 返回的文档数量和.aggreate的集合文档数量一样(即外面的那个集合,而不是新字段的From的那个集合)。

(2)关联的主要功能是将每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组列(户名可根据需要命名新key的名字 )。数组列存放的数据 是 来自 被Join 集合的适配文档,如果没有,集合为空(即 为[ ])。

注意新的字段的类型是数组的形式,一对多的时候,新字段就是就是明显的内嵌子文档。

我们看到新文档的字段 inventory_docs ,它由两个 内嵌 子文档组成,

"inventory_docs" : [

{

"_id" : 4,

"sku" : "pecans1",

"product" : "product 4",

"instock" : 70,

"state" : "OK"

},

{

"_id" : 5,

"sku" : "pecans2",

"product" : "product 4",

"instock" : 70,

"state" : "Simple"

}

]

那么如何根据要求筛选符合要求的子文档呢?$match是不可以的,这时候可以通过$filter。

代码如下:

db.product.aggregate([{

$lookup:

{

from: "inventory",

localField: "product",

foreignField: "product",

as: "inventory_docs"

}

}

,

{

$project: {

inventory_docs: {

$filter: {

input: "$inventory_docs",

as: "item",

cond: { $eq: [ "$$item.state", "OK"]}

}

}

}

}

])

结果显示如下:

/*1*/{

"_id" :1,

"inventory_docs" :[{

"_id" : 1,

"sku" : "almonds",

"product" : "product 1",

"instock" : 120,

"state" : "OK"

}]},/*2*/{

"_id" :2,

"inventory_docs" :[{

"_id" : 2,

"sku" : "bread1",

"product" : "product 2",

"instock" : 80,

"state" : "OK"

}]},/*3*/{

"_id" :3,

"inventory_docs" :[{

"_id" : 4,

"sku" : "pecans1",

"product" : "product 4",

"instock" : 70,

"state" : "OK"

}]}

从结果可以看出,数组子文档 没有了state:"Simple"的数据(子文档)。

本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245425.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python自动化办公知识点整理汇总_python自动化办公小结

在日常办公中,经常免不了和Excel打交道,每次手工处理数据,稍微不细心点。数据可能就出错了。而且重复的任务又会占据大量的工作时间。那有没有办法可以解决这些问题呢?今天介绍一种方法,可以解决日常工作的重复工作&am…

php 图片生成vr_PHP 使用Krpano 生成全景图

技术背景:krpano是一款全景漫游制作软件和工具。引用链接:开发环境:Centos6.5\PHP5.5技术实现:一: 下载官方工具包二:执行生成代码exec( $krpano . krpanotools makepano -config . $krpano . templates/vtour-vr.config %F . $krpano_dir_beta . /*, $…

python ks曲线_python之KS曲线

# 自定义绘制ks曲线的函数def plot_ks(y_test, y_score, positive_flag):# 对y_test,y_score重新设置索引y_test.index np.arange(len(y_test))#y_score.index np.arange(len(y_score))# 构建目标数据集target_data pd.DataFrame({‘y_test’:y_test, ‘y_score’:y_score})…

python sum函数numpy_解决Numpy中sum函数求和结果维度的问题

使用Numpy(下面简称np)中的sum函数对某一维度求和时,由于该维度会在求和后变成一个数,所以所得结果的这一维度为空。比如下面的例子:a np.array([[1,2,3],[4,5,6]])b np.sum(a,axis1)print(b.shape)# (2,)所以,对于一个shape为(…

yii3正式版什么时候发布_华为mate50pro什么时候发布

阅读本文前,请您先点击上面的蓝色字体,再点击“关注”,这样您就可以继续免费收到文章了。每天都有分享,完全是免费订阅,请放心关注。 …

shiro如何保证session不失效_请问在不加锁的情况下如何保证线程安全?

概念compare and swap,解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器…

python visa模块_已经安装了pyvisa仍然报错没有模块

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼找到原因了。原因为pyvis是基于NIVISA的。而我现在的仪器是安捷伦的,必须用安捷伦的VISA。两者虽然都是visa32.dll但是彼此不兼容。只能用其他方法了。新方法。已实现搜索所有可用设备。希望能帮助到更多的人from ctype…

externalreferences 命令在 sdi 模式下不可用_一个适合新手交互式Git命令学习项目

前言在我们日常工作开发中,Git是必不可少的版本控制软件,很多时候我们都用Git来管理我们的项目。比较常用的有Github,Gitlab,Stash等。因此对于Git命令的掌握是我们工作必备的能力。今天分享一个Git命令学习项目:learn…

sqlyong 删除数据能否撤回_数据结构知识点总结

some quoted by Fundebug:代码面试需要知道的8种数据结构(附面试题及答案链接)​zhuanlan.zhihu.comadded with other sources8 种常用数据结构数组栈队列链表图树哈希表priorityqueue1. 数组数组(Array)大概是最简单,也是最常用的数据结构了。其他数据结…

matlab 点云特征_基于点云的3D障碍物检测

击上方“新机器视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达基于点云的3D障碍物检测主要有以下步骤:点云数据的处理基于点云的障碍物分割障碍物边框构建点云到图像平面的投影点云数据的处理KITTI数据集KITTI数据集有四个相…

重定义 不同的基类型_镍及铁镍基耐蚀合金高温合金哈氏合金镍基合金之第一篇概述...

纯镍是一种重要的应用于工业的原材料,它除具有良好 的强度、塑韧性外,在卤族元素及其氢化物活泼性气体、苛 性介质、不含氧和氧化剂的还原性酸介质中还具有良好的耐 蚀性,因此纯镍作为耐蚀金属材料得到广泛应用。此外,由 于提高耐…

mysql脚本模式创建索引_mysql创建脚本索引范例

查看表中索引的方法:show index from table_name; 查看索引索引的类型及创建例子::1.PRIMARY KEY (主键索引)alter table table_name add primary key ( column );2.UNIQUE 或 UNIQUE KEY (唯一索引)alter table table_name add unique (column);3. 删除索引alter table 表名 d…

cad统计面积长度插件vlx_用了它,画cad施工图再也不加班了!

文尾左下角阅读原文看视频教程好课推荐:1、CAD2014:点击查看 2、室内CAD:点击查看 3、CAD2019:点击查看4、CAD2018:点击查看5、Bim教程:点击查看6、室内手绘:点击查看7、CAD三维:点击…

mysql 视图 查询速度慢_mysql 视图查询速度慢

场景:表 stockpooldata_flashCREATE TABLE stockpooldata_flash (id bigint(15) NOT NULL AUTO_INCREMENT,formula_id int(8) DEFAULT NULL,period_type tinyint(3) DEFAULT NULL,gpMarket int(4) DEFAULT NULL,gpcode varchar(20) DEFAULT NULL,ymd int(11) DEFAUL…

局部页面切换url为什么不变_python爬虫 - 翻页url不变网页的爬虫探究

python爬虫-翻页url不变网页的爬虫探究url随着翻页改变的爬虫已经有非常多教程啦,这里主要记录一下我对翻页url不变网页的探究过程。学术菜鸡第一次写CSDN,请大家多多包容~ 如果对你有一点点帮助,请帮我点个赞吧!翻页u…

vtune mysql user_intel vtune 介绍、安装和使用

intel vtune 介绍intel vtune 安装包下载地址intel VTune™ Amplifier 2019 安装手册 - Linux* OS:intel VTune™ Amplifier 用户使用手册安装步骤:Intel VTune Amplifier在Linux环境下的安装: $tar zxvf vtune_amplifie_2018_update3.tar.gz $cd vtune…

python波峰波谷算法_波动均分算法

波动均分算法by leeenx on 2018-01-11「波动」和「均分」大部分读者朋友是知道的,但看到「波动均分」应该是一头雾水的。其实,这个名词是笔者拼凑出来的。什么是「波动均分」?把指定的数值 A,分成 N 份,此时每份的数值…

formatter java_Java编程中的Java Formatter是什么?

Java编程中的Java Formatter是什么?作者:admin分类:PHP, JAVA, .NET文章时间:2017-03-30 21:13:02点击量:1428Java Formatter是一个实用程序类,可以在Java中使用格式化流输出时使生存变得简单。 它的构建类…

python计算矩阵方程_python/sympy求解矩阵方程的方法

sympy版本:1.2假设求解矩阵方程AXA2X其中求解之前对矩阵方程化简为(A−2E)XA令B(A−2E)使用qtconsole输入下面程序进行求解In [26]: from sympy import *In [27]: from sympy.abc import *In [28]: AMatrix([[4,2,3],[1,1,0],[-1,2,3]])In [29]: AOut[29]:Matrix([[ 4, 2, 3],[…

java web 注册登录_javaweb实现登录注册功能实例

前期呢,我们学习了javaweb项目用JDBC连接数据库,还有数据库的建表功能,今天,我们来看一下javaweb实现登录注册功能实例,javaweb项目使用的工具是eclipse,最后把项目部署在了Tomcat中,连接数据库…