【问题标题】:How does mongoose populate work under the hood猫鼬如何在幕后工作
【发布时间】:2015-04-14 18:10:42
【问题描述】:

谁能告诉我

我有一个收藏

a {
 b: String
 c: Date
 d: ObjectId --> j
}

j {
 k: String
 l: String
 m: String
}

当我执行:

a.find({ b: 'thing' }).populate('d').exec(etc..)

这实际上是在后台对 MongoDB 执行两个查询以返回所有项目“j”吗?

我没有问题让填充工作,我关心的是任务的性能影响。

谢谢

【问题讨论】:

    标签: mongodb mongoose mongoose-populate


    【解决方案1】:

    Mongoose 使用两个查询来完成请求。

    查询a 集合以获取与主查询匹配的文档,然后查询j 集合以填充文档中的d 字段。

    您可以通过启用调试输出查看 Mongoose 正在使用的查询:

    mongoose.set('debug', true);
    

    【讨论】:

    • @JohnnyHK 都是由 服务器中的猫鼬代码处理的查询,或者这是否经过调整以使人口在数据库上工作并返回完整的数据?我担心这会导致(至少)两次往返到数据库...我知道这是“更清洁”代码的辅助函数,它确实非常有用,但在某些用途中案例我正在考虑优化查询的执行方式,以避免多个线性(同步)查询并改为进行两个(或更多)并行查询:-)
    • @Fdo Mongoose 使用两个查询,导致两次往返。您可以通过启用调试输出来查看它正在使用的查询:mongoose.set('debug', true);
    • 谢谢@JohnnyHK,我不知道调试模式来分析猫鼬的活动。在定义我的架构时一定会牢记这一点。
    【解决方案2】:

    基本上,模型“a”包含一个属性“d”,该属性引用(指向)模型“j”。

    所以每当我们使用

    a.find({ b: 'thing' }).populate('d').exec(etc..)

    然后通过填充我们可以单独调用 'j' 的属性,例如:

    • d.k
    • d.l
    • d.m

    Populate() 帮助我们调用其他模型的属性。

    【讨论】:

    • 问题是“对MongoDB的两次查询”是否执行。也许你可以澄清一下?
    【解决方案3】:

    添加到@JohnnyHK 关于您担心的任务的性能影响的答案,我相信无论如何,无论我们使用猫鼬提供的populate() 方法还是您将实现服务器的方法,这些查询都必须按顺序执行 -另一方面,两者将具有相同的时间复杂度。

    这是因为为了填充我们需要获得第一个查询的结果,在获得结果后 uuid 将用于查询另一个集合中的文档。

    所以我认为在服务器端进行这些更改比使用 mongoose 提供的方法是一种浪费。性能将保持不变。

    【讨论】:

    • 真的。如果一个查询不依赖于另一个查询的输出,则可以使用两个不同的数据库连接运行两个单独的查询,以便同时获取文档。这将带来更好的性能,尤其是在第一个查询耗时而第二个查询不耗时的情况下。
    猜你喜欢
    • 2017-12-08
    • 2018-07-22
    • 2014-01-01
    • 2018-05-02
    • 2017-05-26
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多