刘来 發表於 2021-7-26 14:16:00

Mongodb $lookup 用法简单介绍

<p><strong>$lookup</strong>&nbsp; 是 Mongodb 3.2版本 新增的聚合框架中的一种查询方式; 主要用来实现多表链接查询; 相当关系型数据库中多表链接查询。</p>
<p>一、基本语法及主要功能</p>
<p><strong>1. 主要功能&nbsp;</strong>是将每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组列(户名可根据需要命名新key的名字 )。数组列存放的数据 是 来自 被Join 集合的适配文档,如果没有,集合为空(即 为[ ])</p>
<p><strong>2.主要语法:</strong></p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">db.collection.aggregate([{
      $lookup: {
               from: "&lt;collection to join&gt;",
               localField: "&lt;field from the input documents&gt;",
               foreignField: "&lt;field from the documents of the from collection&gt;",
               as: "&lt;output array field&gt;"
             }
    })
</pre>
</div>
<p>  </p>
<p><strong>3.语法的解释说明</strong></p>
<div class="table-wrapper">
<table border="0">
<tbody>
<tr>
<td><strong>语法值</strong></td>
<td><strong>解释说明</strong></td>
</tr>
<tr>
<td>
<pre>from</pre>
</td>
<td>同一个数据库下等待被Join的集合。</td>
</tr>
<tr>
<td>
<pre>localField</pre>
</td>
<td>
<p>源集合中的match值,如果输入的集合中,某文档没有&nbsp;localField</p>
<p>这个Key(Field),在处理的过程中,会默认为此文档含</p>
<p>有 localField:null的键值对。</p>
</td>
</tr>
<tr>
<td>
<pre>foreignField</pre>
</td>
<td>待Join的集合的match值,如果待Join的集合中,文档没有foreignField<br>值,在处理的过程中,会默认为此文档含有 foreignField:null的键值对。</td>

</tr>
<tr>
<td>
<pre>as</pre>
</td>
<td>为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉,</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>二、两张表关联查询</p>
<p>1.测试数据准备</p>
<div class="cnblogs_code">
<pre>db.Customer.insert({customerCode:1,name:"customer1",phone:"13112345678",address:"test1"<span>})

db.Customer.insert({customerCode:2,name:"customer2",phone:"13112345679",address:"test2"<span>})

db.Order.insert({orderId:1,orderCode:"order001",customerCode:1,price:200<span>})

db.Order.insert({orderId:2,orderCode:"order002",customerCode:2,price:400})</span></span></span></pre>
</div>
<p>2. $lookup 查询两张表</p>
<div class="cnblogs_code">
<pre><span>db.Customer.aggregate(
    [{      $lookup: {
         from: "Order"<span>,
         localField: "customerId"<span>,
         foreignField: "customerId"<span>,
         as: "customerOder"<span>
         }
    } <span>
    ])</span></span></span></span></span></span></pre>
</div>
<p>效果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/2440562/202107/2440562-20210726134854180-294097100.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;$lookup 中的as:"customerOrder"&nbsp; 聚合为 一个数组类型字段</p>
<p>&nbsp;</p>
<p>三、三张表关联查询</p>
<p>1.准备数据</p>
<div class="cnblogs_code">
<pre>db.Customer.insert({customerCode:1,name:"customer1",phone:"13112345678",address:"test1"<span>})

db.Customer.insert({customerCode:2,name:"customer2",phone:"13112345679",address:"test2"<span>})

db.Order.insert({orderId:1,orderCode:"order001",customerCode:1,price:200<span>})

db.Order.insert({orderId:2,orderCode:"order002",customerCode:2,price:400<span>})

db.orderItem.insert({itemId:1,productName:"apples",qutity:2,orderId:1<span>})
db.orderItem.insert({itemId:2,productName:"oranges",qutity:2,orderId:1<span>})
db.orderItem.insert({itemId:3,productName:"mangoes",qutity:2,orderId:1<span>})

db.orderItem.insert({itemId:4,productName:"apples",qutity:2,orderId:2<span>})
db.orderItem.insert({itemId:5,productName:"oranges",qutity:2,orderId:2<span>})
db.orderItem.insert({itemId:6,productName:"mangoes",qutity:2,orderId:2})</span></span></span></span></span></span></span></span></span></pre>
</div>
<p>2.$lookup 查询三张表</p>
<div class="cnblogs_code">
<pre><span>    db.Order.aggregate([{
      $lookup: {
               from: "Customer"<span>,
               localField: "customerCode"<span>,
               foreignField: "customerCode"<span>,
               as: "curstomer"<span>
             }
      
    },
   <strong> {
      $lookup: {
               </strong><strong>from: "orderItem"<span>,
               localField: "orderId"<span>,
               foreignField: "orderId"<span>,
               as: "orderItem"</span></span></span></strong><span><strong>
             }
    }</strong>
    }]
   </span></span></span></span></span></span></pre>
</div>
<p>效果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/2440562/202107/2440562-20210726135633196-1224692953.png"></p>
<p>&nbsp;</p>
<p>&nbsp;$lookup 中的as:"customerOrder"&nbsp; 聚合为 一个数组类型字段</p>
<p>$lookup 中的as:"orderItem"&nbsp; 聚合为 一个数组类型字段</p>
<p>&nbsp;</p>
<p>由此可见,关联多少个人表,就可以使用多少个$lookup来做关联;</p>
<p>至此 $lookup 简单用法介绍完毕!</p>
<h2>&nbsp;</h2>
</div>
<p>1.测试数据准备</p><br><br>
来源:https://www.cnblogs.com/howardxu/p/15061192.html
頁: [1]
查看完整版本: Mongodb $lookup 用法简单介绍