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

标签 javascript node.js mongodb mongoose nosql

我有一个 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 不是很熟悉。

sortpopulate 的性能结果是什么?我假设 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/

相关文章:

javascript - 我可以使用 gulp 将一个文件中的内容插入到另一个文件中吗?

mongodb - 移动 MongoDB 的数据文件夹?

python - Pymongo:如何在文档中插入多个字段的数组?

javascript - 如何使用 jQuery 让元素滚动到 View 中?

javascript - 填充水平空间

Node.js "Cannot read property ' userAgent' 未定义"on require

javascript - 灵活的 JavaScript 函数(适用于 MongoDB)

javascript - 淡出前置 div

javascript - svg 到 json.js |我的文件去哪儿了?

javascript - Multer 从不同的输入但从相同的表单上传不同的文件