@vostotskiy

Как отфильтровать результаты lookup агрегации в MongoDB?

Доброго времени суток. Имеется следующая задача.
Есть сущность Event, имеющая свое описание, у которой есть свои список организаторов в виде массива ссылок и список воркшопов (сущность Workshop).
const EventSchema = new Schema(
  {
    title: {type: String, default:'', required: true},
    description: {type: String, default:''},
    startDate: {type: Date, default: Date.now, required: true},
    founders: [{ type: Schema.Types.ObjectId, ref: 'User' }],
    workshops: [{ type: Schema.Types.ObjectId, ref: 'Workshop' }],
  });

Две сущности хранятся в виде отдельных коллекций.
Примерная структура сущности Workshop
const WorkshopSchema = new Schema(
  {
    title: {type: String, default:'', required: true},
    description: {type: String, default:''},
    event:{ type: Schema.Types.ObjectId, ref: 'Event' },
    actors: [{ type: Schema.Types.ObjectId, ref: 'User' }],
  });


У одного ивента(мероприятия) может быть несколько воркшопов(мастер-классов).

Для отображения параметров ивентов на странице воркшопа делается populate запрос по полю workshops,
сущность workshop имеет также поле Event, по которому делается populate, чтобы отобразить параметры Ивента на странице конкретного workshop.

В чем задача- нужно вытащить все воркшопы, имеющие отношение к конкретному юзеру, а именно: он может быть в числе actor-ов конкретного воркшопа либо в списке founder-ов Ивента(тогда все связанные с ивентом воркшопы нужно вытянуть)

Есть предположение, что нужно изначально сделать правильную агрегацию: изначально приджоинить lookupом воркшопы к своим родительским ивентам, а потом отфильтровать по условию OR (наличие id юзера в Event.founders и Workshop.actors)

Непосредственно lookup выглядит так
db.getCollection('workshops').aggregate([
   {
     $lookup:
       {
         from: "events',
         localField: "event",
         foreignField: "_id",
         as: "events"
       }
  }
])


Подскажите, пожалуйста, как сделать последующую OR фильтрацию по Event.founders и Workshop.actors по ID конкретного пользователя(наличие в массиве ID) или как по другому построить логику запроса.

Thanks in advance.
  • Вопрос задан
  • 405 просмотров
Решения вопроса 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
Добавьте $match после $lookup использованием оператора $or. Вы же можете получать доступ к полям.

Что-то вроде этого:
$lookup...,
$or: [
  {actors: USER_OBJECT},
  {'events.founders': USER_OBJECT}
]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы