有人可以告诉我如何
我有一个集合
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'?
我没有遇到填充问题的问题,我关心的是任务的性能影响。
由于
答案 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'的属性,例如:
Populate()帮助我们调用其他模型的属性。
答案 2 :(得分:0)
在@JohnnyHK上添加有关您担心的任务的性能影响的答案,我相信无论如何,无论我们使用猫鼬提供的populate()
方法还是您将要实现的方法,这些查询都必须按顺序执行服务器端,两者的时间复杂度相同。
这是因为为了填充,我们需要具有第一个查询的结果,获得结果后,uuid将用于查询另一个集合中的文档。
因此,我认为在服务器端进行这些更改比使用猫鼬提供的方法要浪费。性能将保持不变。