MongoDB查询在使用索引时对内存限制进行排序

问题描述 投票:0回答:1

我有一个SensorData集合,它总是包含以下字段:_id,datetimeMeasure,sensorId,originalDataId和value,并且在默认id索引旁边有以下索引:{“sensorId”:1,“datetimeMeasure”: - 1}

当通过Loopback(NodeJS)执行下面的查询时,我得到以下错误:在find命令期间执行错误::由:: Sort操作使用超过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

node.js mongodb mongodb-query loopbackjs
1个回答
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 })
© www.soinside.com 2019 - 2024. All rights reserved.