【问题标题】:Make many populate in deep populate, 2nd level使许多填充深度填充,第 2 级
【发布时间】:2019-03-27 23:41:23
【问题描述】:

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

【问题讨论】:

  • 这里的问题是,如果不了解模型实际上如何相互关联以及预期结果是什么,我们就无法确定您所做的事情会出现什么问题。您基本上需要显示来自每个模型的样本数据,这些数据预计将被所有 populate() 调用检索。 真正的大问题是 大量的连接,而 MongoDB 的设计初衷并非如此。此外,您可能没有意识到每次键入populate 时实际上是对服务器的另一个查询。我在这里数了 11 个请求。
  • 基本上 11 个请求 到服务器(每个 findBy 和 populate 上的每个提及)只是为了返回页面上的一些数据非常过度 b> 并且会给您带来持续的重大性能问题。您确实需要重新设计它,因为您仍然在关系方面考虑太多。 $lookup 可以通过发出一个请求来提供帮助,但是“加入”在这里仍然是一个很大的开销。

标签: node.js mongodb mongoose mongoose-schema mongoose-populate


【解决方案1】:

这里的错误在于第二个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 }
        }
    ]
})

用上面的代码代替你的第二个填充查询,它会起作用。

【讨论】:

    猜你喜欢
    • 2016-06-27
    • 2017-04-08
    • 2015-01-25
    • 1970-01-01
    • 2015-02-09
    • 2011-09-26
    • 2017-09-15
    • 2017-07-06
    • 2018-12-12
    相关资源
    最近更新 更多