Запуск внутреннего и внешнего соединения - PullRequest
0 голосов
/ 17 октября 2018

У меня есть 3 коллекции, каждая из которых имеет различный набор информации:

  • предлагает
  • провайдеров
  • пользовательских настроек

Предложенияи к провайдерам можно присоединиться, используя provider_id:

 const aggregate = Offers.aggregate();
 aggregate.lookup({
   from: 'providers'
   localField: 'provider_id',
   foreignField: 'provider_id',
   as: 'providers'
 });
 aggregate.unwind({
   path: '$providers'
 });

Между предложениями и поставщиками существует взаимно-однозначное отношение (т. е. я гарантированно найду поставщика для каждого предложения).

IТакже необходимо определить, понравилось ли пользователю какое-либо из этих предложений.

Прямо сейчас, когда я создаю второй поисковый вызов, возвращаются только те предложения, которые понравились пользователю, а не все предложения, независимо от того, понравились они пользователю или нет.Не все предложения будут иметь запись (record_id === offer_id && record_type === 'offer') в коллекции userpreferences.

aggregate.lookup({
    from: 'userpreferences',
    localField: 'offer_id',
    foreignField: 'record_id',
    as: 'userprefernces'
});
aggregate.unwind({
    path: '$userprefernces',
    preserveNullAndEmptyArrays: true
});
aggregate.match({
    'userprefernces.user_id': params.userId,
    'userprefernces.record_type': 'offer'
});

Может кто-нибудь сказать мне, почему это происходит?

1 Ответ

0 голосов
/ 17 октября 2018

Я сидел в небольшой группе с экспертом MongoDb один раз.Я помню, как он говорил, чтобы избежать совокупностей.То, что вы пытаетесь сделать, можно сделать с помощью методов find (). ToArray () в каждой из трех коллекций.Использовать метод find при сопоставлении с индексированным полем для каждой из коллекций лучше, чем писать сложные агрегаты с поисками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...