Mon go Db конвейер агрегации с петлей - PullRequest
1 голос
/ 03 марта 2020

У меня есть коллекция, которая содержит полмиллиона данных, и я хочу получить среднее значение для всех месяцев между датой, которую я ввожу. Сейчас я получаю данные за весь год, но я хочу, чтобы они были разделены на один месяц, т.е. на 12 диапазонов данных за каждый месяц.

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

let filter = 'y';
const date = new Date();
let checkDate = moment().subtract(1.5, 'years')._d;
MeterData.aggregate([
      {
          $group: {
              _id: "$meter_id",
              // total: { $sum: 1 },
              totalEnergy: filter !== 'a' ? {
                $sum: {
                  $toDouble: {
                      $cond: {
                        if: {
                          $gte: [
                            "$date", checkDate
                          ]
                        },
                        then: "$energy.Energy",
                        else: 0
                      }
                }
                                  }
               } : { $sum: { $toDouble: 
                    "$energy.Energy"
                   } }
          },
               }
  ]);

Здесь я получаю totalEnergy за весь год, в поле totalEnergy, но теперь я хочу, чтобы totalEnergy плюс ежемесячные вычисления для года, в который я вхожу , Любая идея о том, как это сделать. ?

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

{"_id":{"$oid":"5e557779ed588826d84cef11"},
"meter_id":"1001",
"date":{"$date":{"$numberLong":"1509474600000"}},
"parameter_name":"hvac","voltage":{"unit":"V"},
"current":{"unit":"AMP"},
"powerFactor":{"unit":"phi"},
"angle":{"unit":"degree"},
"activePower":{"unit":"kwh"},
"reactivePower":{"unit":"kwh"},
"apparentPower":{"unit":"kwh"},
"frequency":{"unit":"hz"},
"thd":{"unit":"percentage"},
"energy":{"Energy":"5.7"},
"power":{"unit":"watt"},

Согласно предложению Райана Ганнера, я получил ответ, который вставляю ниже, у меня просто есть еще одна проблема.

[
  {
    meter_id: '1001',
    month: '2017-10',
    totalEnergy: 0,
    averageEnergy: 0
  } + 11 more months......
] 

Теперь мне нужно общее количество энергии за 12 месяцев. Например, итоговое поле totalEnergy за все 12 месяцев в одной переменной.

1 Ответ

1 голос
/ 03 марта 2020

как насчет этого?

var startDate = new ISODate('2020-04-01');
var endDate = new ISODate('2019-04-01');

db.collection.aggregate(
    {
        $match: {
            $expr: {
                $and: [
                    { $gt: ['$date', endDate] },
                    { $lt: ['$date', startDate] }]
            }
        }
    },
    {
        $group: {
            _id: {
                meter: '$meter_id',
                month: { $dateToString: { format: '%Y-%m', date: '$date' } }

            },
            totalEnergy: { $sum: { $toDouble: '$energy.Energy' } },
            averageEnergy: { $avg: { $toDouble: '$energy.Energy' } }
        }
    },
    {
        $project: {
            meter_id: '$_id.meter',
            month: '$_id.month',
            totalEnergy: '$totalEnergy',
            averageEnergy: '$averageEnergy',
            _id: 0

        }

    },
    {
        $sort: { meter_id: 1 }
    }
    {
        $group: {
            _id: null,
            grandTotalEnergy: { $sum: '$totalEnergy' },
            monthlyData: { $push: '$$ROOT' }
        }
    },
    { $project: { _id: 0 } }
)

обновление: добавлено поле grandTotalEnergy и помещено monthData в массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...