Агрегаты MongoDB (время и среднее значение)

#mongodb #aggregation-framework

#mongodb #платформа агрегации

Вопрос:

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

Мои данные выглядят так:

 [
  {
    "_id": "57fbebf99929a71d305e2bb2",
    "temp": 23.77,
    "dateTime": "2016-10-10T19:28:57.923Z",
    "_dateTime": 1476127737000
  },
  {
    "_id": "57fbebfa9929a71d305e2bb3",
    "temp": 27.16,
    "dateTime": "2016-10-10T19:28:58.838Z",
    "_dateTime": 1476127738000
  },
  {
    "_id": "57fbebff9929a71d305e2bb4",
    "temp": 31.93,
    "dateTime": "2016-10-10T19:29:03.848Z",
    "_dateTime": 1476127743000
  }
]
  

Код (javascript) пока выглядит так..

  var results = temperatures.aggregate(
     [
        { $project : { "timeSpan" : {$add : [new Date(0),"$_dateTime"] } } },
        { $project : {  "minuteRead" : { $minute : "$timeSpan" }} }, 
        { 
             $group : { 
                _id : {minuteRead : "$minuteRead" },
                count : { $sum : 1 } 
            } 
        }
     ], 
     function(err, result) {
        console.log(result);
    }
 );
  

С выводом:

 [ { _id: { minuteRead: 30 }, count: 7 },
  { _id: { minuteRead: 29 }, count: 12 },
  { _id: { minuteRead: 28 }, count: 2 } ]
  

Но то, что я хотел бы иметь, это:

 [ { _id: { minuteRead: 30 }, avgTemp: 17.6 },
  { _id: { minuteRead: 29 }, avgTemp: 18.3 },
  { _id: { minuteRead: 28 }, avgTemp: 20.1 } ]
  

Возможно ли это?

Спасибо!

Ответ №1:

«$ avg» сделал бы свое дело

 $group : { 
                _id : {minuteRead : "$minuteRead" },
                avgTemp : { $avg :"$temp" } 
            } 
  

Комментарии:

1.Я тоже так думал, но, похоже, значения $ temp недоступны. Нужно ли мне добавлять его в $project? ` [ { _id: { minuteRead: 30 }, среднее время: null },` { _id: { minuteRead: 29 }, avgTemp: null }, { _id: { minuteRead: 28 }, avgTemp: null } ]

Ответ №2:

Понял!

 temperatures.aggregate(
        [
           { $project: { temp:'$temp', "timeSpan": { $add: [new Date(0), "$_dateTime"] } }},
           { $project: { "timestamp": { $minute: "$timeSpan" }, temp:'$temp' } },
           {
               $group: {
                   _id: { minuteRead: "$timestamp" },
                    avgTemp : { $avg :"$temp" }
               }
           }
        ],
        function (err, result) {
            if (err)
                console.log("ERROR "   err);
            else
                console.log(result);
        }
    );