node.js - 使用索引时MongoDB查询排序超出内存限制

标签 node.js mongodb mongodb-query loopbackjs

我有一个 SensorData 集合,它始终包含以下字段:_iddatetimeMeasuresensorIdoriginalDataIdvalue 并具有以下索引,位于默认 ID 索引旁边:{ "sensorId": 1, "datetimeMeasure": -1 }

通过 Loopback (NodeJS) 执行下面的查询时,出现以下错误:由于::排序操作使用的 RAM 超过最大 33554432 字节,导致 find 命令::期间执行器错误。添加索引,或指定较小的限制。

// Loopback query
SensorData.find({
    where: {
        sensorId: { inq: [] /* array with sensor ids */ },
        datetimeMeasure: { between: ["2018-12-24T23:00:00.000Z", "2018-12-31T23:00:00.000Z"] }
    }
});

// Mongo query (Loopback seems to automatically add the sort)
find({
  sensorId: { $in: [] /* array with sensor ids */ },
  datetimeMeasure: {  
    $gte: "2018-12-24T23:00:00.000Z",
    $lte: "2018-12-31T23:00:00.000Z"
  }
}).sort({ datetimeMeasure: -1 })

当我检查查询日志时,我可以看到索引已被使用(IXSCAN)。可能是什么问题?

我在 NodeJS 10.15.0 上使用 mongo 4.0.6 和 Loopback 3.25.0

最佳答案

我建议尝试使用聚合管道,因为它可以在大型查询期间假脱机到磁盘。

https://docs.mongodb.com/manual/reference/command/aggregate/

所以你的命令会是这样的

aggregate([{
  $match: {
    sensorId: { $in: [] /* array with sensor ids */ },
    datetimeMeasure: {  
      $gte: "2018-12-24T23:00:00.000Z",
      $lte: "2018-12-31T23:00:00.000Z"
    }   
  }
}, { $sort: { datetimeMeasure: -1 } } ], { allowDiskUse: true })

关于node.js - 使用索引时MongoDB查询排序超出内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55026509/

相关文章:

node.js - 我应该在哪个路径安装socket.io进行node.js编程

javascript - 函数返回待处理的 promise 而不是结果

javascript - 如何在不知道其位置的情况下删除 Mongo 对象(向下嵌套 2 个数组)?

mongodb - 为什么 mongodb 按 _id 排序比按任何其他索引字段排序快得多?

mongodb - 从 Mongo DB 嵌套数组中获取不同的值并输出到单个数组

node.js - openShift Node 版本上的 meteor

javascript - 如何在 Node.js 中执行一组同步和异步函数

java - 更新 Spring Mongo 的服务器时间

c# - 数据模型和服务模型之间的继承模式是什么?

sql - 如果没有 JOIN,那么在文档数据库中处理数据的正确方法是什么?