我有一个 SensorData 集合,它始终包含以下字段:_id、datetimeMeasure、sensorId、originalDataId和 value 并具有以下索引,位于默认 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/