2016-10-10 101 views
0

我想知道是否有可能對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 } ] 

這可能嗎?

謝謝!

回答

0

的 「$平均」 會做的伎倆

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

我也這麼認爲,但似乎$ temp值是不可訪問的。我需要將它添加到$項目中嗎? '{{_id:{minuteRead:30},avgTemp:null},' '{_id:{minuteRead:29},avgTemp:null},' '{_id:{minuteRead:28},avgTemp:null }]' – wmmhihaa

0

明白了!

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