【问题标题】:Unable to access result of $addFields in $lookup in MongoDB Aggregate function无法在 MongoDB 聚合函数的 $lookup 中访问 $addFields 的结果
【发布时间】:2022-01-03 09:19:06
【问题描述】:

我有一个聚合函数,其中有带有管道的嵌套查找。 在其中一个管道中,我有以下内容 -

{
 "$addFields": {
  "ids": {
     "$split": ["$id", ","]
   }
  }
},
{
 "$lookup": {
   "from": 'collection2',
   "let": {"new_id": "$ids"},
    "pipeline": [
     { "$match": {
        "$expr": {
           "$in": ["$ID", "$$new_id"]
         }  
        } 
      }
     ],
    "as": 'groups'
   }
  }

在上述管道中,addFields 将 "id" 中的逗号分隔 值拆分并将其添加到名为 " 的数组中 id”

这个 "ids" 我在下面的查找中使用它来使用 "$in" 从其他集合中查找数据。

但我在 MongoDB Compass 中遇到此错误 - $in 需要一个数组作为第二个参数,发现:null

我通过在 Compass 中的单独聚合管道中仅使用此管道进行了相同的尝试,我可以正确获取结果,但是当我在嵌套查找管道中包含相同的结果时,它不起作用并出现上述错误。

是因为嵌套还是任何局部变量或任何其他问题?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework mongodb-compass


    【解决方案1】:

    错误信息$in requires an array as a second argument, found: null表示找到了一个值,它为空。

    如果根本没有找到值,错误应该是"$in requires an array as a second argument, found: missing"

    最可能的问题是集合中的一个或多个文档没有id 字段,因此$split 返回null。

    要解决这个问题,您可以使用 $ifNull 运算符在 $split 返回 null 时返回一个空数组,例如:

    {"$addFields": {
      "ids": {
         "$ifNull":[
              {"$split": ["$id", ","]},
              []
         ]
       }
      }
    }
    

    【讨论】:

    • 谢谢。明白了问题所在。你的解决方案奏效了。
    • 一个更正是使用“$ifNull”来检查 Null。我认为有一个拼写错误。
    • 是的,这是一个错字。
    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 2022-01-05
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2019-03-24
    • 2021-08-04
    • 2019-05-10
    相关资源
    最近更新 更多