我正在使用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
查询中:
.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
就像上面的例子一样,last populate会覆盖之前的populate。
现在回来解决你的问题,
您需要将数组传递给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 }
}
]
})
替换上面的代码代替你的第二个填充查询,它将工作。