猫鼬是如何在幕后工作的

时间:2015-02-13 16:22:12

标签: mongodb mongoose mongoose-populate

有人可以告诉我如何

我有一个集合

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'?

我没有遇到填充问题的问题,我关心的是任务的性能影响。

由于

3 个答案:

答案 0 :(得分:10)

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

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

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

mongoose.set('debug', true);

答案 1 :(得分:1)

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

所以只要我们使用

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

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

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

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

答案 2 :(得分:0)

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

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

因此,我认为在服务器端进行这些更改比使用猫鼬提供的方法要浪费。性能将保持不变。