【问题标题】:local variable in lookup aggregate not working查找聚合中的局部变量不起作用
【发布时间】:2023-03-09 04:25:02
【问题描述】:

我有两个集合,callcontact

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

ps。当我将"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'
}

【问题讨论】:

  • 对 let "$$mobile" 中的声明变量使用双精度 $$。但是您必须使用$expr 条件来匹配内部字段。 $match: { $expr: { $eq: ["$$mobile", "$d.v"] } }
  • @turivishal 你是对的,我错了,非常感谢

标签: mongodb mongodb-query aggregate


【解决方案1】:

docs中指定:

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

...

$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"
    }
  }
])

Mongo Playground

【讨论】:

    猜你喜欢
    • 2021-04-21
    • 2021-01-22
    • 2016-01-12
    • 1970-01-01
    • 2021-11-14
    • 2018-12-11
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多