node.js - 使用索引时 MongDB 查询排序超过内存限制
问题描述
我有一个 SensorData 集合,它始终包含以下字段:_id、datetimeMeasure、sensorId、originalDataId和value,并且在默认 id 索引旁边有以下索引:{ "sensorId" : 1, "datetimeMeasure" : -1 }
通过 Loopback (NodeJS) 执行下面的查询时,我收到以下错误:查找命令期间的执行程序错误 :: 由 :: Sort 操作导致使用超过最大 33554432 字节的 RAM。添加索引,或指定较小的限制。
// 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 上使用带有 Loopback 3.25.0 的 mongo 4.0.6
解决方案
我建议尝试使用聚合管道,因为它可以在大型查询期间假脱机到磁盘。
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 })
推荐阅读
- authentication - 如何控制 ASP.NET Core Cookie 身份验证的声明、票证和属性的序列化?
- sbt - SBT 的无人值守静默安装不起作用
- sql - SQL - 为什么 SELECT 查询已被 INSERT 阻塞?
- php - 客户端错误:错误请求。错误 400。NoCaptcha Laravel Anhskohbo
- c++ - 指向对象数组内函数的指针数组
- javascript - 如何通过“TableId”对具有相同功能的多个表进行排序?
- java - DatagramPacket 的 IP 字段何时从destinationIP 更改为sourceIP?
- dart - 沿着名称值对向服务器发送多部分请求
- coinbase-api - Coinbase Pro API - 无效签名
- javascript - javascript: 模块调用文件中需要模块的函数