Заставь многих заселяться в глубоких, 2-й уровень - PullRequest
0 голосов
/ 24 марта 2019

Я делаю запрос вложенных объектов, используя заполнение, и когда я хочу получить доступ к населению второго уровня, он не распознает меня, если не последнее заполнение.

Я работаю под nodejs и mongodb, используя библиотеку mongoose

Для популяции 'tours_favoritos' меня узнает только последнее: 'guia' с его популяцией 'идиом'. Я не заполняю 'sitios', ни 'turistas', ни 'categoryoria', ни '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);
        }
    })
})

}

См. Код

1 Ответ

0 голосов
/ 27 марта 2019

Ошибка здесь во втором 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 }
        }
    ]
})

замените приведенный выше код вместо вашего второго заполненного запроса, и он будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...