Сортировка запросов MongDB по лимиту памяти при использовании индекса - PullRequest
0 голосов
/ 06 марта 2019

У меня есть коллекция SensorData, которая всегда содержит следующие поля: _id , datetimeMeasure , sensorId , originalDataId и значение и имеет следующий индекс рядом с индексом идентификатора по умолчанию: {"sensorId": 1, "datetimeMeasure": -1}

При выполнении запроса ниже через Loopback (NodeJS) я получаю следующую ошибку: Ошибка исполнителя во время команды поиска :: вызвана операцией :: Сортировка, использовавшая более 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). В чем может быть проблема?

Я использую Mongo 4.0.6 с Loopback 3.25.0 на NodeJS 10.15.0

1 Ответ

0 голосов
/ 06 марта 2019

Я бы предложил попробовать использовать конвейер агрегации, так как он может наматывать на диск во время больших запросов.

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