Не получается правильный результат с агрегатом и конвейером

Возникли проблемы с использованием конвейера и получением правильных данных в моем совокупном запросе. У меня есть две коллекции, где они обе имеют общий идентификатор (eventId), который я хочу использовать, чтобы «присоединиться» к этим коллекциям.

Документ из коллекции Pool

{
  "_id": ObjectId("5e1ebbc6cffd4b042fc081ab"),
  "eventId": "ABC_2020-01-15_40_1",
  "trackName": "Foo",
  "type": "bar"
}

Документ из коллекции Races (несколько с одинаковым eventID

{
  "_id": ObjectId("5e1ebbc6cffd4b042fc081a1"),
  "eventId": "ABC_2020-01-15_40_1",
  "Data": {foo:"bar"}
}

Данные, которые я получаю, включают в себя все документы из коллекции рас, кажется, что конвейер не работает, так как я получаю тот же результат, как если бы я передавал [] в конвейере. Я хотел бы получить некоторую помощь в выяснении этого, так как я хочу, чтобы в результате были только те, которые имеют одинаковый eventId в обеих коллекциях.

const result = await PoolModel.aggregate([

        {
          $match: {
            eventId,
          },
        },
        {
          $lookup: // join two collections
          {
            from: 'races', // races collection
            let: { eventId: '$event.eventId' }, // define vars to use in pipeline
            pipeline: [
                { $match: { $expr: ['$eventId', '$$eventId']  } },

                { $project: projection },
            ],
            as: 'races', // Display in new result as as

          },
        },

      ]);

Это мой результат:

 result: [ { _id: 5e1ebbc6cffd4b042fc081ab,
        eventId: 'ABC_2020-01-15_40_1',
        trackName: 'Foo',
        type: 'bar',
        races:
         [ [Object], // Wrong id 
           [Object], // Wrong id 
           [Object], // Wrong id 
           [Object], // Wrong id 
           [Object], // Wrong id 
           [Object], // Wrong id 
           [Object], // Wrong id 
           [Object], // Correct id
           [Object], // Correct id
           [Object], // Correct id
           [Object], // Correct id
           [Object], // Correct id
           [Object], // Correct id
           [Object], // Correct id
           [Object] ] } ]

Всего 1 ответ


В конвейере объединенной коллекции $expr ожидает оператор условного сравнения (с примером использования его в конвейере $lookup ), и вы его не указали, так что по сути фильтрация не происходит.

Вы бы предпочли использовать оператор $eq как

{ '$match': { '$expr': { '$eq': ['$eventId', '$$eventId'] } } },

Есть идеи?

10000