Не получается правильный результат с агрегатом и конвейером - PullRequest
1 голос
/ 15 января 2020

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

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

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

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

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

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

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 Ответ

1 голос
/ 15 января 2020

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

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

{ '$match': { '$expr': { '$eq': ['$eventId', '$$eventId'] } } },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...