Я нашел несколько сообщений и руководств, в которых хвалят возможность выполнять соединения в Mongoose и MongoDB с использованием метода populate().
Это меня смущает. Если вы хотите выполнять соединения, разве вам не следует использовать базу данных SQL? Разве присоединение к MongoDB не должно быть последним средством?
Каждый объект, использующий populate(), должен выполнить второй запрос для получения этих данных. Поэтому, если вы выбираете 100 элементов в запросе, вам нужно выполнить еще 100 запросов, чтобы получить эти данные. Похоже, что лучше хранить вложенные схемы там, где это возможно.
Я ошибаюсь? Действительно ли populate() - отличный метод, который имеет смысл? Или я прав в том, что это крайний вариант, который можно использовать в случаях, которых следует избегать?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


populate () не отправляет запрос find для каждого дочернего документа для каждого родительского документа.
он отправляет один find со всеми дочерними ObjectIds (всех родителей!) в фильтре.
пример (вывод на консоль mongoose.set('debug', true)):
Mongoose: parent.find({}, { fields: {} }) // was called with populate()
Mongoose: child.find({ _id: { '$in': [ ObjectId(A), ObjectId(B), ...] }})
а затем, вероятно, «присоединяет» родителей к дочерним элементам в узле.
по сути, был добавлен только 1 RTT. чтобы избежать этого в максимально возможной степени, я денормализовал некоторые из моих схем для общих случаев использования.
в этой статье говорится не о populate () ... (а о $ lookup).
в соответствии с выводом консоли и в соответствии с этой проблемой: github.com/Automattic/mongoose/issues/3683 (проверьте комментарии за октябрь 2017 г.) populate не использует $ lookup под капотом.
Я понимаю. Итак, вернемся к исходному вопросу. Действительно ли заселение - отличное решение, как утверждают люди? Следует ли использовать его как соединения в SQL или разработчик должен попытаться разработать свою схему таким образом, чтобы заполнение использовалось экономно?
Я читал, что до того, как populate () был добавлен в библиотеку, люди делали все эти "соединения" вручную ... так что эта новая функция была для многих из них находкой. Что касается выбора БД, необходимо учитывать множество компромиссов и вещей.
imo, вы должны изучить денормализацию своих схем, чтобы требовать заполнения только в крайних / менее распространенных случаях
См. График в конце этой статьи. medium.com/dbkoda/coding-efficient-mongodb-joins-97fe0627751 а становится экспоненциально медленнее, чем больше объектов необходимо соединить.