让很多人居住在第二层

问题描述 投票:0回答:1

我正在使用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);
        }
    })
})

}

See code

node.js mongodb mongoose mongoose-schema mongoose-populate
1个回答
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

就像上面的例子一样,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 }
        }
    ]
})

替换上面的代码代替你的第二个填充查询,它将工作。

© www.soinside.com 2019 - 2024. All rights reserved.