Я заметил, что функция .populate в mongoose 4.7.3 запускает отдельные запросы к базе данных для каждого поиска:
db.House
.populate('ownerId')
.exec((err, result) => {
..
С конвейером агрегации мы можем искать несколько коллекций с помощью одного запроса:
db.House.aggregate([
{
$lookup:
{
from: 'owners',
localField: 'ownerId',
foreignField: '_id',
as: 'owner',
},
По какой причине мангуст выполняет отдельные запросы с .populate? Является ли функция агрегирования более эффективной при поиске?
Вот краткое изложение различий:
$lookup
aggregate
Мангуст populate()
find
и aggregate
_id
Мне интересно... я неправильно прочитал руководство по монгоддб? Я нашел информацию о том, что агрегат работает и с сегментированными базами данных.
@AdrianMoisa aggregate
может, но не $lookup
. Я добавил ссылку на документы для этого.
Спасибо тебе за пояснение. Только что нашел этот интересный отвечать. То же самое, что вы сделали.
Могу ли я не .populate() использовать что-то другое, кроме _id? Я думал, что вы можете установить виртуальную в своей схеме, предоставив localField и ForeignField (со ссылкой на модель) и .populate(). Думаю, я никогда не пробовал, но я мог бы просто установить для localField или ForeignField значение, отличное от «_id»?
Функциональность
populate()
в Mongoose — это функция агрегации запросов на стороне клиента, которая предшествовала добавлению поддержки$lookup
на стороне сервера в MongoDB 3.2.