聚合框架是MongoDB的高级查询语言,它允许我们通过转换和合并多个文档中的数据来生成新的单个文档中不存在的信息。
聚合管道操作主要包含下面几个部分:
命令 功能描述 美元的项目 指定输出文档里的字段。 $匹配 选择要处理的文档,与细()类似。 美元的限制 限制传递给下一步的文档数量。 美元跳过 跳过一定数量的文档。 美元的放松 扩展数组,为每个数组入口生成一个输出文档。 美元集团 根据关键来分组文档。 美元的排序 排序文档。 geoNear美元 选择某个地理位置附近的的文档。 美元了 把管道的结果写入某个集合。 美元的修订 控制特定数据的访问。
查找美元 多表关联(3.2版本新增)地址>
在本篇幅中,我们聚焦元查找的使用。
<强> 1。主要功能强>是将每个输入待处理的文档,经过美元查找阶段的处理,输出的新文档中会包含一个新生成的数组列(户名可根据需要命名新键的名字)。数组列存放的数据是来自被加入集合的适配文档,如果没有,集合为空(即为[])
<强> 2。基本语法强>
{ $查找: { 来自:& lt;收集join> localField: & lt;从输入documents>领域; foreignField: & lt;字段的文档”从“collection>, :& lt;输出数组field> } }
3。语法的解释说明
语法值 解释说明 从 同一个数据库下等待被加入的集合。 localField
源集合中值的匹配,如果输入的集合中,某文档没有,localField
这个键(字段),在处理的过程中,会默认为此文档含
有localField:空的键值对。
foreignField 待加入的集合的匹配值,如果待加入的集合中,文档没有foreignField值,在处理的过程中,会默认为此文档含有foreignField:空的键值对。 作为 为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉,
(注:null=null此为真)
其语法功能类似于下面的伪SQL语句:
SELECT * & lt;输出数组field> 从集合 & lt;输出数组field>在SELECT * join> & lt;收藏; & lt; foreignField>=& lt; collection.localField>);
以上的语法介绍有些枯燥,不易理解,我们直接分析品味案例好了。
假设有订单集合,存储的测试数据如下:
db.orders.insert ([ {" _id ": 1,“项”:“杏仁”,“价格”:12,“数量”:2}, {" _id ": 2,“项”:“胡桃”,“价格”:20岁的“量”:1}, {" _id ": 3} )
其对中项应数据为商品名称。
另外一个就是就是商品库存集合,存储的测试数据如下:
db.inventory.insert ([ {" _id ": 1、“sku”:“杏仁”,描述:“1”,“有现货的”:120}, {" _id ": 2,“sku”:“面包”,描述:“产品2”,“有现货的”:80}, {" _id ": 3,“sku”:“腰果”,描述:“产品3”,“有现货的”:60}, {" _id ": 4,“sku”:“胡桃”,描述:“产品4”,“有现货的”:70}, {" _id ": 5“sku”: null,描述:“不完整”}, {" _id ": 6} )
此集合中的sku数据等同于订单集合中的商品名称。
在这种模式设计下,如果要查询订单表对应商品的库存情况,应如何写代码呢?
很明显这需要两个集合加入。
场景简单,不做赘述,直送答案。其语句如下:
db.orders.aggregate ([ { $查找: { :“库存”, localField:“项”, foreignField:“sku”, 如:“inventory_docs” } } )
返回的执行结果如下: