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"的数据(子文档)。
本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!
mysql mongo关联查询语句_MongoDB 集合间关联查询后通过$filter进行筛选相关推荐
- mysql数据库查询语句过程_mysql(一) SQL查询语句执行过程
mysql基础架构 示意图 首先 mysql 大概分为 server层 和 存储引擎层 两个部分, 引擎的架构模式是插件形式的,mysql支持多种引擎如 InnoDB.MyISAM.Memory 等 ...
- mysql 伪表查询语句_MySQL数据库之select查询语句
select查询语句 语法 select [选项] 列名 [from 表名] [where 条件] [group by 分组] [order by 排序][having 条件] [limit 限制] ...
- mysql 查询语句超时_解决SQL查询总是 超时已过期
1.由于数据库设计问题造成SQL数据库新增数据时超时 症状: Microsoft OLE DB Provider for SQL Server 错误 '80040e31' ([ODBC SQL Ser ...
- java oracle分页查询语句_oracle分页查询语句,java得到分页查询语句的方法
oracle分页查询语句 select * from ( select a.*, rownum rn from (select * from table_name) a where rownum &l ...
- JAVA中oracle分页语句,oracle分页查询语句,java得到分页查询语句的方法
oracle分页查询语句 select * from ( select a.*, rownum rn from (select * from table_name) a where rownum &l ...
- oracle 动态条件查询语句,教您Oracle动态查询语句的用法
Oracle动态查询语句是一类特殊的查询语句,下面就为您详细介绍Oracle动态查询语句的语法,如果您对Oracle动态查询方面感兴趣的话,不妨一看. 1. 当使用EXECUTE IMMEDIATE语 ...
- 关于oracle查询语句中like '%中文的%' 查询不到数据的问题
关于oracle查询语句中like '%中文的%' 查询不到数据的问题 问题描述: 关于oracle查询语句中like '%中文的%' 查询不到数据的问题解决 起因: 在Windows10 系统环境下 ...
- mysql 子表 关联查询语句_mysql查询语句 和 多表关联查询 以及 子查询
1.查询一张表: select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 from ...
- mysql多表查询语句_mysql查询语句 和 多表关联查询 以及 子查询
1.查询一张表:select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select字段1,字段2,字段3 frome ...
最新文章
- IDEA : Git Pull Failed 解决(IDEA中使用stash功能)
- 【百度地图API】——国内首款团购网站的地图插件
- Linux系统的启动过程
- python的闭包及装饰器
- vr降噪器英文是什么_CR渲染器和VR渲染器在3d效果图上的区别
- 【OpenCV3】cv::Mat的定义与初始化
- 判断字符串NSString是否是整形或者浮点型
- ANE的开发需求一般太少,这个静态库如何包含第三方
- 20. 利用Veeam ONE监控vSphere虚拟化平台(Veeam ONE安装及配置)
- Windows XP SP3细节官方详解
- 调度失败:执行器地址为空_三千字带你搞懂XXL-JOB任务调度平台
- react-native-router-flux 使用详解(三)
- 什么是接口?接口的定义和使用
- Retinex网络模型学习笔记
- 职场五大能力之学习能力
- 手把手教你写专利申请书/如何申请专利
- ADS-B及雷达显示终端8.2
- 自定义水晶报表的外观
- 无线网络打印机服务器安装步骤,在win7安装带网络服务器的打印机步骤.ppt
- linux 多核cpu监控,Linux 下多核CPU知识
热门文章
- 浙大计算机学院朱建科,浙江大学计算机科学与技术学院导师介绍:朱建科
- c语言无符号数除法,[求助]关于双字节无符号数除法
- [蓝桥杯][2018年第九届真题]日志统计(树状数组)
- 对计算机网络与系统的认识,浅谈对计算机网络的认识
- win10关闭windows聚焦_Win10优化:这8个操作简单的小方法让你的Win10系统更加流畅...
- 【计算机网络】TCP/IP模型
- ad19电气规则检查_PROTEL DXP电气规则检查
- python数据分类_Python数据挖掘实践—KNN分类
- USACO Training Section 1.1黑色星期五Friday the Thirteenth
- 最容易被忽视的学习材料--技术标准 (z)