Производительность агрегации для большой коллекции в MongoDB - PullRequest
0 голосов
/ 30 марта 2020

У меня большая коллекция в mongodb. В этой коллекции около 70-80 миллионов документов. Но когда я запускаю конвейер агрегации, для возврата результатов требуется почти 5 минут. Можно ли как-нибудь уменьшить время результата агрегации?

Я не могу найти какое-либо соответствующее решение для сокращения времени на конвейер агрегации.

Ниже приведен пример документа.

   {
  "data": {
    "_id": "5e557779ed588826d84cef27",
    "meter_id": "1001",
    "date": "2017-10-31T18:52:00.000Z",
    "parameter_name": "hvac",
    "voltage": {
      "unit": "V",
      "Voltage": 0
    },
    "current": {
      "unit": "AMP",
      "Current": 0
    },
    "powerFactor": {
      "unit": "phi",
      "PowerFactor": 0
    },
    "angle": {
      "unit": "degree"
    },
    "activePower": {
      "unit": "kwh"
    },
    "reactivePower": {
      "unit": "kwh"
    },
    "apparentPower": {
      "unit": "kwh",
      "ApparentPower": 0
    },
    "frequency": {
      "unit": "hz",
      "Frequency": 0
    },
    "thd": {
      "unit": "percentage"
    },
    "energy": {
      "unit": "J",
      "Energy": 0
    },
    "power": {
      "unit": "watt",
      "Power": 0
    },
    "__v": 0
  }
}

А ниже - конвейер агрегации, который я использую

MeterData.aggregate([
  {
    $match: {
        $expr: {
            $and: [
                 {$gt: ["$date", checkDate] },
                { $lt: ["$date", moment(checkDate).add(1, 'years')._d] },
              ]
        }

    }
},
{

  $group: {
    _id: {  
      day: { $dateToString: { format: "%Y-%m", date: "$date" } },
      meter: '$meter_id'

  },
  totalEnergy: { $sum: { $toDouble: "$energy.Energy" } },
  }
},
{
    $project: {
        meter_id: '$_id.meter',
        month: '$_id.day',
        totalEnergy: '$totalEnergy',
                _id: 0
    }
},
{
    $sort: { month: 1 }
}

Спасибо за помощь.

1 Ответ

0 голосов
/ 30 марта 2020

Две альтернативы этому:

  1. Вы можете создавать индексы для полей, по которым вам необходимо запросить данные. Это первый рекомендуемый подход. Ссылка
  2. Создание сводных коллекций поверх существующей коллекции, содержащей ссылки. По сути, это означает, что у вас есть ключ, который уникальным образом идентифицирует запись в вашей текущей коллекции, а затем создает сводную коллекцию сверху, в которой хранятся эти ссылки. Это также приведет к изменению пользовательского интерфейса, в котором вы можете отобразить результаты в виде нескольких шагов в зависимости от того, что вы получите. Это всегда хороший компромисс между производительностью UX и запросом времени с большими данными.
...