如何提高MongoDB / Mongoose查询的性能?

时间:2018-01-24 19:57:35

标签: javascript node.js mongodb mongoose nosql

我有一个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正在做什么,所以我不清楚如何避免它或在数据库级索引以提高性能。

1 个答案:

答案 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不会导致任何重大的性能问题。

希望它有所帮助!