我正在使用填充查询嵌套对象,并且想要访问第二级填充时,如果不是最后一个填充,它不会识别我
我正在使用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);
}
})
})
}
答案 0 :(得分:0)
这里的错误是在第二个populate
查询中
.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 }
}
})
您正在传递一个对象来填充函数,并且每次在该对象内部使用另一个填充时,它都会覆盖旧的对象,类似于任何对象定义。
例如:
var a={
foo : "bar",
foo : "bar2",
foo : "bar3"
}
//the last foo overrides the first two
//a.foo = bar3
就像上面的示例一样,最后一个填充将覆盖之前的填充。
现在返回解决您的问题,
您需要将数组传递到populate
字段,以便它填充您想要的所有给定字段
尝试一下:
.populate({
path: 'tours_favoritos',
model: Tour,
populate: [
{ path: 'sitios', model: Sitio },
{ path: 'turistas', model: Turista },
{ path: 'categoria', model: CategoriaTour },
{ path: 'empresa_turismo', model: EmpresaTurismo },
{
path: 'guia', model: Guia,
populate: { path: 'idiomas', model: Idioma }
}
]
})
将上面的代码替换为第二个填充查询,它将起作用。