mongodb 管道 $lookup 中的 $in/$eq 不起作用

Posted

技术标签:

【中文标题】mongodb 管道 $lookup 中的 $in/$eq 不起作用【英文标题】:$in/$eq in mongo pipeline $lookup is not working 【发布时间】:2021-04-27 14:03:26 【问题描述】:

我有一个集合details,在quotes_id 上有一个字符串值数组,如下所示


    "quantity": 2000,
    "quotes_id": ["SQ-CPQ10037"],
    "status": "processed",
    "logs": [""],
    "product_id": "5ff5cf3dc1ceb9144901da81"

还有我的quotes 收藏


    "_id":"SQ-CPQ10037",
    "product_id":"5ff5cf3dc1ceb9144901da81",
    ...more fields here

现在,我正在尝试使用如下查找管道从另一个名为 quotes 的集合中访问此集合

$lookup: 
     from: "details",
     "let":  "product_id": "$quotes.product_id", "quotes_id": "$quotes._id",
     pipeline: [
      
         $match:  
            $expr:  
               $and: [
                  $in: [ "$quotes_id",  ["$$quotes_id"] ] ,
                  $eq: [ "$product_id",  "$$product_id" ] ,
               ]
            
         
     ],      
     as: "product.productquotes",
,

这是返回空集合。但是,如果我评论该行

 $in: [ "$quotes_id",  ["$$quotes_id"] ] ,

然后它会将记录返回给我。我还尝试使用简单的$eq 来处理quotes_id,但结果相同。但是如果我直接运行查询就像

$and: ["product_id": ObjectId('5ff5cf3dc1ceb9144901da81'), "quotes_id": "SQ-CPQ10037"]

在 mongo compass 上,我收到记录没有任何问题。

【问题讨论】:

你为什么用[ ]$$quote_id 包装? $quotes 是一个对象吗? 因为,我用过$in。我尝试使用不带数组括号的 $eq 。结果相同。 【参考方案1】:

你做的几乎是正确的。但是错误地写了$in args。 in 的第二个参数应该是一个数组。


  $in: [
    "$$quotes_id",
    "$quotes_id"
  ]

所以查找喜欢

db.quotes.aggregate([
  
    $lookup: 
      from: "details",
      "let":  "product_id": "$product_id", "quotes_id": "$_id" ,
      pipeline: [
        
          $match: 
            $expr: 
              $and: [
                  $in: [ "$$quotes_id", "$quotes_id" ] ,
                  $eq: [ "$product_id", "$$product_id" ]                 
              ]
            
          
        
      ],
      as: "product.productquotes"      
    
  
])

工作Mongo playground

【讨论】:

以上是关于mongodb 管道 $lookup 中的 $in/$eq 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB——聚合管道之$lookup操作

MongoDB——聚合管道之$lookup操作

使用 $lookup 和 let 和管道在 MongoDB 中声明变量

MongoDB 聚合 $lookup 到具有管道语法和 _id 作为字符串的父数组字段

mongodb 中的 $lookup 嵌套数组

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