如何使用 $lookup MongoDB 进行 LEFT JOIN

Posted

技术标签:

【中文标题】如何使用 $lookup MongoDB 进行 LEFT JOIN【英文标题】:How to make a LEFT JOIN using $lookup MongoDB 【发布时间】:2018-01-25 23:03:56 【问题描述】:

我创建了下面的视图。如果不是,我想让所有客户都使用地址类型计费的 orderheader,我仍然想要 orderheader 文档。我认为匹配阶段正在消除少量文档,因为没有针对少数文档的地址类型计费。

我的意思是它的行为类似于 INNER JOIN,而不是我想要 LEFT JOIN。努力,但我得到的只是 INNER JOIN。

    db.createView(
       "VWOrderHeader",
       "OrderHeader",
       [
         
          $lookup:  
             from:"AddressDoc",
             as: "Address",
             localField: "CustomerNo",
             foreignField: "CustomerNo"
          
        ,
        
            $match: "Address.AddressType":/Billing/i 
        ,
        
            $project:
                _id:0,
                CustomerNo :"$CustomerNo",
                ContactName: $ifNull:[$arrayElemAt: [ "$Address.ContactName",0 ],""]
            
        
       ]
)

【问题讨论】:

【参考方案1】:

将查询重写为

 db.createView(
       "VWOrderHeader",
       "OrderHeader",
       [
         
          $lookup:  
             from:"AddressDoc",
             as: "Address",
             localField: "CustomerNo",
             foreignField: "CustomerNo"
          
        ,
     $unwind:  path: "$Address", preserveNullAndEmptyArrays: true  ,
    
        $match: $or:[ "Address.AddressType":/billing/i,"Address.AddressType":"","Address.AddressType":null] 
    ,
        
            $project:
                _id:0,
                CustomerNo :"$CustomerNo",
                ContactName: $ifNull:[ "$Address.ContactName",""]
            
        
       ]
)

【讨论】:

以上是关于如何使用 $lookup MongoDB 进行 LEFT JOIN的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongodb 中使用 $lookup $let 变量?

如何使用 MongoDB 聚合 `$lookup` 作为 `findOne()`

如何在 mongodb 中使用 $lookup 加入多个集合

如何在 mongoDB 的第二级实现`lookup`? [复制]

如何在 mongoDB 的第二级实现`lookup`? [复制]

如何在 mongodb 中应用 $lookup 条件?