我有一个SensorData集合,该集合始终包含以下字段: _id , datetimeMeasure , sensorId , originalDataId 和 value 并在默认ID索引旁边具有以下索引: {“ sensorId”:1,1,“ datetimeMeasure”:-1}
当通过Loopback(NodeJS)执行以下查询时,出现以下错误:查找命令::执行期间的执行器错误::由::排序操作使用的RAM超过了最大33554432字节。添加索引,或指定较小的限制。
// 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
答案 0 :(得分: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 })