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

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 不太熟悉。

什么是性能后果sortpopulate?我认为populate是这里的罪魁祸首?我不太确定populate在做什么,所以我不清楚如何避免它或在数据库级别建立索引以提高性能。

Jaz*_*tha 6

Mongoose文档中,“填充是用来自其他集合的文档自动替换文档中的指定路径的过程”

因此,您ObjectId对您的引用将model被整个Mongoose document. 因此,在多个路径中这样做query会减慢您的应用程序的速度。如果要保持相同的代码结构,可以使用select来指定document应该填充的字段,即{ path: 'colors', model: 'Color', select: 'name' }. 因此Color document,您无需返回此处的所有数据,而只需获取名称即可。

您还可以调用cursor()queryMongoDB以下位置流式传输结果:

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 在您达到更大的数据库之前,不会导致任何重大的性能问题。

希望能帮助到你!