我有一个 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()
尽管产品集合中只有 60 个文档,但此查询最多花费 4 秒。
此查询来自以前的开发人员,我对 Mongoose 不是很熟悉。
sort
和 populate
的性能结果是什么?我假设 populate
是罪魁祸首?我不太确定 populate
在做什么,所以我不清楚如何避免它或在数据库级别建立索引以提高性能。
最佳答案
在 Mongoose
文档中,“填充是用其他集合中的文档自动替换文档中指定路径的过程”
因此,您的 model
上的 ObjectId
引用将被整个 Mongoose
document
取代。因此,在一个query
中对多个路径执行此操作会减慢您的应用程序。如果你想保持相同的代码结构,你可以使用 select
来指定应该填充 document
的哪些字段,即 { path: 'colors' ,模型:'颜色',选择:'名称'
。因此,您无需在此处返回 Color
document
的所有数据,而只需获取名称即可。
您还可以调用 cursor()
从 MongoDB
流式传输 query
结果:
var cursor = Person.find().cursor();
cursor.on('data', function(doc) {
// Called once for every document
});
cursor.on('close', function() {
// Called when done
});
您可以在 Mongoose
文档中阅读有关 cursor
function
的更多信息 here .
一般来说,尽量只对特定任务使用populate
,例如只为一种产品获取颜色名称。
sort
不会导致任何重大的性能问题。
希望对您有所帮助!
关于javascript - 如何提高这个 MongoDB/Mongoose 查询的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48430660/