【问题标题】:MongDB query sort over memory limit while using indexMongoDB查询排序超过内存限制,同时使用索引
【发布时间】:2019-03-06 15:21:51
【问题描述】:

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

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

【问题讨论】:

  • 这种类型可能是问题所在。看看你能不能说服 Loopback 不要那样做。
  • 当我添加索引 { datetimeMeasure: -1 } 时,它将用于排序,因此错误消失。如何验证现有的复合索引仍将用于获取数据并且它没有进行 COLLSCAN?
  • 你使用explain()检查查询计划。

标签: node.js mongodb mongodb-query loopbackjs


【解决方案1】:

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

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 })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多