【发布时间】:2019-03-27 23:41:23
【问题描述】:
我正在使用 populate 查询嵌套对象,当想要访问第二级的人口时,如果不是最后一个人口,它就无法识别我
我正在使用 mongoose 库在 nodejs 和 mongodb 下工作
'tours_favoritos' 的人口只认得我最后一个:'guia' 和它的 'idiomas' 人口。我不填充“sitios”、“turistas”、“categoria”和“empresa_turismo”。如果我更改填充顺序,则只有最后一个填充我。
servicev1.addGustoFavorito = function (id_turista, id_gusto) {
return new Promise(function (resolve, reject) {
GustoTurista.findById(id_gusto, function (error, gusto) {
if (!error) {
var query = Turista.findByIdAndUpdate(id_turista, { $push: { gustos: gusto._id } }, { new: true });
query.
populate({
path: 'empresas_favoritas', model: EmpresaTurismo
}).
populate({
path: 'tours_favoritos',
model: Tour,
populate: { path: 'sitios', model: Sitio },
populate: { path: 'turistas', model: Turista },
populate: { path: 'categoria', model: CategoriaTour },
populate: { path: 'empresa_turismo', model: EmpresaTurismo },
populate: {
path: 'guia', model: Guia,
populate: { path: 'idiomas', model: Idioma }
}
}).
populate({
path: 'gustos', model: GustoTurista
})
.exec(function (err, success) {
if (err) {
return reject(err);
}
else {
return resolve(success);
}
})
} else {
return reject(error);
}
})
})
}
【问题讨论】:
-
这里的问题是,如果不了解模型实际上如何相互关联以及预期结果是什么,我们就无法确定您所做的事情会出现什么问题。您基本上需要显示来自每个模型的样本数据,这些数据预计将被所有
populate()调用检索。 真正的大问题是 大量的连接,而 MongoDB 的设计初衷并非如此。此外,您可能没有意识到每次键入populate时实际上是对服务器的另一个查询。我在这里数了 11 个请求。 -
基本上 11 个请求 到服务器(每个
findBy和populate上的每个提及)只是为了返回页面上的一些数据非常过度 b> 并且会给您带来持续的重大性能问题。您确实需要重新设计它,因为您仍然在关系方面考虑太多。$lookup可以通过发出一个请求来提供帮助,但是“加入”在这里仍然是一个很大的开销。
标签: node.js mongodb mongoose mongoose-schema mongoose-populate