mongodb - поиск $ с оператором $ if - PullRequest
1 голос
/ 05 августа 2020

Строю побочный проект. где я хочу использовать вложенные $ lookup и $ unwind, если определенное условие соответствует. Ниже я создал простой прототип. у некоторых пользователей есть номера, а у некоторых нет номеров. Я хочу присоединиться, если число не равно null или не определено

вот код -

users.aggregate([



{
     
        $lookup: "number",
        localField:"user.number",
        foreignField:"name",
        as:"number"
     
   }
    {
                $unwind: {
                    path: "$number",
                    preserveNullAndEmptyArrays: true
                }
    }
    ,
   {
     
        $lookup: "countries",
        localField:"number.countrycode",
        foreignField:"name",
        as:"countries"
     
   },

   {

      $unwind:"countries",
      //preserveNullAndEmptyArrays

   },
   $project:{

       name:1,
       number:"$number.phoneNumber",
       countryCode:"$countries.countryCode"


    }
 ])

Вывод:

[{

name:"yashraj basan"
number:"123345677",
countryCode:"US"
},
{

name:"krutik basan"
number:"123345679",
countryCode:"FR"
}]

Сейчас я получаю все пользователи, у которых есть номера, но мне нужны оба пользователя, у которых есть номер, и у кого нет номера

Ожидаемый результат:

[{
    
    name:"yashraj basan"
    number:"123345677",
    countryCode:"US"
    },
    {
    
    name:"krutik basan"
    number:"123345679",
    countryCode:"FR"
    },
    {
      name:"dhruvam basan",
      number:"",
      countrycode:""
    },{
     name:"foo bar",
number:"",
countrycode:""
    }]

Я ценю все ваши вклады. спасибо

1 Ответ

1 голос
/ 05 августа 2020

Нет необходимости запускать $lookup условно. Вы можете сделать это для каждого пользователя, но тогда, когда вы используете $unwind, вы можете воспользоваться опцией preserveNullAndEmptyArrays :

{
    $lookup: {
        from:"countries",
        localField:"user.number.countrycode",
        foreignField:"name",
        as:"countries"
    }
},
{
    $unwind: {
        path: "countries",
        preserveNullAndEmptyArrays: true
    }
}
...