локальная переменная в агрегате поиска не работает

#mongodb #mongodb-query #aggregate

Вопрос:

У меня есть две коллекции, call и contact .

Я хочу присоединиться к ним и показать имя контакта в записи звонка. Приведенный ниже код-это то, что я пробовал.

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'
}
 

Комментарии:

1. используйте double $$ для объявленной переменной в let "$$mobile" . но вы должны использовать $expr условие для соответствия внутренним полям. $match: { $expr: { $eq: ["$$mobile", "$d.v"] } }

2. @turivishal Ты прав, я ошибся, большое спасибо

Ответ №1:

Как указано в документах:

Чтобы ссылаться на переменные на этапах конвейера, используйте синтаксис»$$».

Этап $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"
    }
  }
])
 

Игровая площадка Монго