Как выбрать из коллекции субдокументы с пагинацией?

Доброго дня.
Есть коллекция, назовем ее Reports.
Пример документа коллекции Reports
{
   _id: '123123123',
   name: 'Report 1',
   userStatuses: [
      {
         userId: '1234567',
         userEmail: 'email@foo.bar`
      },
      {
         userId: '1234567',
         userEmail: 'email@foo.bar`
      },
   ],
   createdAt: '2021-05-14 06:01:25.444Z'
}

Есть другая коллекция, UsersMap.
Пример документа коллекции UsersMap
{
    "_id" : "YGh2gkct9C4cNce4j",
    "email" : "user@foo.bar",
    "external_id" : "12345678",
    "userAccessLevel" : "user",
    "createdAt" : "2019-08-13T20:16:07.175Z"
}

Нужно выбрать из коллекции Reports все субдокументы внутри "userStatuses", с джойном ($lookup'ом) и с возможностью пагинации. То есть, чтобы запрос выбирал сперва все userStatuses, у которых в коллекции UsersMap роль "user", убрал дубликаты (distinct) и потом, по результату уже сделать skip & limit.

Сделал агрегацию через $lookup, однако
- выборка происходит по коллекции Reports, а нужно выбрать поддокументы
- дубликаты внутри userStatuses
Никак не могу понять, как сделать выборку из отдельных сущностей коллекции, да еще и с дистинктом, и с skip \ limit.

Запрос с агрегацией
db.Reports.rawCollection().aggregate(
  [
    {
      $match: {
        'createdAt': {
          $gte: dateRangeStart.toDate(),
          $lt: dateRangeEnd.toDate(),
        },
      }
    },
    {
      $lookup: {
      from: 'UsersMap',
      as: 'map',
      let: { userId: '$userStatuses.userId' },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $eq: ['$_id', '$$userId'] },
                { $eq: ['$userAccessLevel', 'user'] },
              ]
            }
          }
        }
      ]
    },
  ]
);


Подскажите, как можно сделать такое в Монге? Куда копать?
Заранее спасибо.
  • Вопрос задан
  • 36 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы