有人可以告诉我如何
我有一个收藏
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”吗?
我对填充工作没有任何问题,我担心的是任务的性能影响。
谢谢
有人可以告诉我如何
我有一个收藏
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”吗?
我对填充工作没有任何问题,我担心的是任务的性能影响。
谢谢
Mongoose 使用两个查询来完成请求。
查询集合以获取与主a
查询匹配的文档,然后查询j
集合以填充d
文档中的字段。
您可以通过启用调试输出来查看 Mongoose 正在使用的查询:
mongoose.set('debug', true);
基本上模型' a '包含一个属性' d ',它引用(指向)模型' j '。
所以每当我们使用
a.find({ b: 'thing' }).populate('d').exec(etc..)
然后通过填充我们可以单独调用'j'的属性,例如:
Populate() 帮助我们调用其他模型的属性。
添加到@JohnnyHK 对您担心的任务的性能影响的回答,我相信无论如何,无论我们使用猫鼬提供populate()
的方法还是您将实现服务器端的方法,这些查询都必须按顺序执行,两者都将具有相同的时间复杂度。
这是因为为了填充我们需要获得第一个查询的结果,在获得结果后 uuid 将用于查询另一个集合中的文档。
因此,我认为在服务器端进行这些更改比使用 mongoose 提供的方法是一种浪费。性能将保持不变。