Поиск Mongodb с совпадением в агрегате возвращает пустой массив - PullRequest
1 голос
/ 12 марта 2020

Это мой пользователь документ

{
   "_id":"02a33b9a-284c-4869-885e-d46981fdd679",
   "context":{
      "email":"someemail@gmail.com",
      "firstName":"John",
      "lastName":"Smith",
      "company":[
         "e2467c93-114b-4613-a842-f311a8c537b3"
      ],
   },
}

и компания документ

{
   "_id":"e2467c93-114b-4613-a842-f311a8c537b3",
   "context":{
      "name":"Coca Cola",
      "image":"someimage",
   },
};

Это мой запрос для пользователей

let users = await Persons.aggregate(
            [{$project:
            {
                name: {$concat: ['$context.firstName', ' ', '$context.lastName']},
                companyId: {$arrayElemAt: ['$context.company', 0]}}
            },
            {$match: {name: searchRegExp}},
            {$lookup: {from: 'companies', let: {company_id: {$arrayElemAt: ['$context.company', 0]}}, pipeline:
            [
                {
                    $match: {
                        $expr: {
                            $eq: ['$_id', '$$company_id']
                        }
                    }
                },
                {
                    $project: {name: '$context.name'}
                }
            ],
            as: 'company'}}
            ]).toArray()

Когда я запускаю этот запрос, я получаю поле компании как пустой массив, что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Ваша первая ступень конвейера $project выводит только _id, name и companyId, поэтому, когда вы пытаетесь сослаться на $context.company в вашем $lookup, будет пустое значение. Вы можете использовать $ addFields вместо:

{
    $addFields: {
        name: {
            $concat: [
                "$context.firstName",
                " ",
                "$context.lastName"
            ]
        },
        companyId: {
            $arrayElemAt: [
                "$context.company",
                0
            ]
        }
    }
}

Пн go Детская площадка

1 голос
/ 12 марта 2020

Когда вы добавляете поле companyId: {$arrayElemAt: ['$context.company', 0]}}, вы можете использовать простую версию $lookup. Нет необходимости устанавливать его дважды, один раз как companyId: ... и в let: {company_id: ...}

db.user.aggregate([
   {
      $addFields: {
         name: { $concat: ["$context.firstName", " ", "$context.lastName"] },
         companyId: { $arrayElemAt: ["$context.company", 0] } 
      }
   },
   {
      $lookup: {
         from: "company",
         localField: "companyId",
         foreignField: "_id",
         as: "company"
      }
   }
])
...