我有一个GET所有产品端点,这需要很长时间才能返回响应:
127.0.0.1
此查询最多需要 4秒,尽管产品系列中只有60个文档。
此查询来自之前的开发人员,我对Mongoose不太熟悉。
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()
和sort
的性能影响是什么?我认为populate
应该归咎于此?我不确定populate
正在做什么,所以我不清楚如何避免它或在数据库级索引以提高性能。
答案 0 :(得分:3)
来自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
});
您可以在cursor
文档here中详细了解function
Mongoose
。
一般情况下,请尝试仅使用populate
执行特定任务,例如只获取一种产品的颜色名称。
sort
不会导致任何重大的性能问题。
希望它有所帮助!