joh*_*thy 1 javascript mongoose mongodb nosql node.js
我有一个 GET all products 端点,它需要很长时间才能返回响应:
Product.find(find, function(err, _products) {
if (err) {
res.status(400).json({ error: err })
return
}
res.json({ data: _products })
}).sort( [['_id', -1]] ).populate([
{ path: 'colors', model: 'Color' },
{ path: 'size', model: 'Size' },
{ path: 'price', model: 'Price' }
]).lean()
Run Code Online (Sandbox Code Playgroud)
尽管产品集合中只有 60 个文档,但此查询最多需要4 秒。
这个查询来自以前的开发人员,我对 Mongoose 不太熟悉。
什么是性能后果sort和populate?我认为populate是这里的罪魁祸首?我不太确定populate在做什么,所以我不清楚如何避免它或在数据库级别建立索引以提高性能。
从Mongoose文档中,“填充是用来自其他集合的文档自动替换文档中的指定路径的过程”
因此,您ObjectId对您的引用将model被整个Mongoose document. 因此,在多个路径中这样做query会减慢您的应用程序的速度。如果要保持相同的代码结构,可以使用select来指定document应该填充的字段,即{ path: 'colors', model: 'Color', select: 'name' }. 因此Color document,您无需返回此处的所有数据,而只需获取名称即可。
您还可以调用cursor()以query从MongoDB以下位置流式传输结果:
var cursor = Person.find().cursor();
cursor.on('data', function(doc) {
// Called once for every document
});
cursor.on('close', function() {
// Called when done
});
Run Code Online (Sandbox Code Playgroud)
您可以cursor function在此处的Mongoose文档中阅读有关 的更多信息。
通常,尝试仅populate用于特定任务,例如仅获取一种产品的颜色名称。
sort 在您达到更大的数据库之前,不会导致任何重大的性能问题。
希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
1895 次 |
| 最近记录: |