
在前面的分享中,有讲解 “详解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",{ "_ID" : 4,"sku" : "pecans1",product: "product 4","instock" : 70 },{ "_ID" : 5,"sku" : "pecans2",])
一个是商品对应的原料集合product,存储的测试数据,如下。
db.product.])两个集合都包含有product 字段,如果 需求是按原料名称统计每个原料对应的商品情况。
可以根据字段product进行集合关联,并且product集合的文档与inventory 集合的文档是 一对多 的关系。
执行关联脚本查询的脚本如下:
db.product.aggregate( { $lookup: { from: "inventory",localFIEld: "product",foreignFIEld: "product",as: "inventory_docs" } }])
新生成的聚合集合的文档如下:
/* 1 */{ "_ID" : 1,"product" : "product ","description" : "金玉满堂1","inventory_docs" : { "_ID" : 1,"product" : "product 1","instock" : 120,"state" : "OK" } ]}, 2 2 { "_ID" : 2,"product" : "product 2","instock" : 80,"state" : "OK" },{ "_ID" : 3,"state" : "Simple" } 3 34 { "_ID" : 4,"product" : "product 4","instock" : 70,{ "_ID" : 5,1)">}
从返回结果可以看出,
(1) 返回的文档数量和.aggreate的集合文档数量一样(即外面的那个集合,而不是新字段的From的那个集合)。
(2)关联的主要功能是将每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组列(户名可根据需要命名新key的名字 )。数组列存放的数据 是 来自 被Join 集合的适配文档,如果没有,集合为空(即 为[ ])。
注意新的字段的类型是数组的形式,一对多的时候,新字段就是就是明显的内嵌子文档。
我们看到新文档的字段 inventory_docs ,它由两个 内嵌 子文档组成,
"inventory_docs" : [ { "_ID" : 4,"state" : "Simple" } ]
那么如何根据要求筛选符合要求的子文档呢?$match是不可以的,这时候可以通过$filter。
代码如下:
db.product.aggregate( { $project: { inventory_docs: { $filter: { input: "$inventory_docs",as: "item",cond: { $eq: [ "$$item.state","OK" ] } } } } }])
结果显示如下:
}从结果可以看出,数组子文档 没有了state:"Simple"的数据(子文档)。
本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!
总结以上是内存溢出为你收集整理的MongoDB 集合间关联查询后通过$filter进行筛选 详解MongoDB中的多表关联查询($lookup)全部内容,希望文章能够帮你解决MongoDB 集合间关联查询后通过$filter进行筛选 详解MongoDB中的多表关联查询($lookup)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)