在第二层深层人口密集区

时间:2019-03-24 08:44:17

标签: node.js mongodb mongoose mongoose-schema mongoose-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

1 个答案:

答案 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 }
        }
    ]
})

将上面的代码替换为第二个填充查询,它将起作用。