Я пытаюсь сломать свой менталитет РСУБД с Mongoose в приложении node.js и могу использовать некоторые рекомендации относительно лучших практик.
Простой пример: скажем, есть две коллекции, организациии контакты.Это отношения один-ко-многим, и они оба должны быть одинокими.Однако в методе индекса я хочу вернуть массив организационных объектов, каждый из которых содержит массив контактных объектов-членов.(А позже я хочу вернуть массив контактов, каждый из которых имеет объект организации.)
Мне кажется, что я неправильно понимаю, как лучше всего это сделать.Вот варианты, которые я вижу до сих пор:
Встраивать контакты с их идентификаторами в документы организации.Тогда индексный запрос может быть Organization.find({}, function(err, orgs) { orgs[n].contacts[n]...})
. Недостаток : требуется много дополнительного хранилища, и приходится обновлять вложенные контактные документы каждый раз, когда вы меняете «основной» контактный документ.
Воспользуйтесь преимуществами Mongoose Заполните / DBRef структуру для хранения идентификаторов "внешнего ключа" в обеих таблицах.Запрос может быть: Organization.find({}}.populate('contacts').run(...)
. Недостаток : ключи должны храниться с обеих сторон.
Перейти по более традиционному маршруту «внешний ключ», сохраняя только идентификатор организации в документе контакта.Запросите документы организации, а затем запросите все контакты в обратном вызове запроса организации, объединив данные в один объект для возврата. Недостаток : Несколько запросов и дополнительные накладные расходы на обработку (я считаю, что мы должны найти организации и контакты для этих организаций независимо, а затем выполнить итерацию по каждому из них, сопоставляя их вручную в общем поле _id, чтобы объединить их в новыйвыходной объект).
Я должен упустить лучший вариант.Что-то, что допускает схему # 3, но возвращает требуемый комбинированный объект с гораздо меньшими накладными расходами.
ПРИМЕЧАНИЕ : модуль async , кажется, может помочь с этим, но действительно ли это единственный / лучший способ?