首页 > 解决方案 > 查找聚合中的局部变量不起作用

问题描述

我有两个系列,callcontact.

我想加入他们并在通话记录中显示联系人姓名。下面的代码是我尝试过的。

附言。当我更改它时"d.v":"$mobile""d.v":"some number"它可以工作,但是当我使用变量不起作用时,我的问题在哪里?

{
  from: 'contact',
  let: {"mobile":"$user"},
  pipeline:[
    {
        "$project":{
          d:{$objectToArray:"$data"},
          doc:"$$ROOT",
        }
    },
    {
        "$unwind":{
          path: "$d",
          preserveNullAndEmptyArrays: true
        }
    },
    {
        "$match":{
          "d.v":"$mobile"
          }
    },
],
  as: 'name'
}

标签: mongodbmongodb-queryaggregate

解决方案


文档中所述:

要在管道阶段引用变量,请使用“$$”语法。

...

$match 阶段需要使用 $expr 运算符来访问变量。$expr 运算符允许在 $match 语法中使用聚合表达式。

在更改这两个以匹配要求后,您的阶段将如下所示:

db.call.aggregate([
  {
    "$lookup": {
      from: "contact",
      let: {
        "mobile": "$user"
      },
      pipeline: [
        {
          "$project": {
            d: {
              $objectToArray: "$data"
            },
            doc: "$$ROOT",
            
          }
        },
        {
          "$unwind": {
            path: "$d",
            preserveNullAndEmptyArrays: true
          }
        },
        {
          "$match": {
            $expr: {
              $eq: [
                "$$mobile",
                "$d.v"
              ]
            }
          }
        },
        
      ],
      as: "name"
    }
  }
])

蒙戈游乐场


推荐阅读