2012-10-03 66 views
3

我正在以不同的時間間隔(1到5秒)將我的MongoDB 2.2(db - > monitoring - > kWh)的功率測量值(瓦特)記錄下來。我的收藏中的數據包裝如下。使用MapReduce或Aggregation Framework進行PHP,MongoDB和電源監控

{ 
    "_id":ObjectId("5060c134f05e888e03000001"), 
    "reading":"power", 
    "watts":"549.", 
    "datetime":1348518196 
} 

我需要信息到每小時,因此小時內總結所有從一小時至年底,並分開始的瓦被讀取次數。我需要能夠通過PHP將這個結果推送到MongoDB中的新集合中。這當然可以作爲cron作業運行,但是是否有機制將其作爲插入的一部分執行?

datetime字段是Unix時間戳。

回答

1

您可以用MR與象的表達函數做到這一點很容易:

function(){ 
    emit(hour, {count: this.watts}); 
} 

hour變量會有一個標準化小時,該行被處理的時間(在我下面的PHP代碼片段所示) ,使用如下所示的方法:convert date to timestamp in javascript?或者您可以傳入來自mktime()的PHP cronjob的外部變量。

做一個非常簡單的減少到總結他們並做一個outmerge到主要小時聚合集合運行從調用MR的PHP cronjob。

然而,這似乎對於這樣的事情有點矯枉過正和個人而言,我會做這個直在PHP中,如:

$cursor = $db->collection->find(array('datetime' => array('$gte' => time()-3600))); 
$sumWatts = 0; 
foreach($cursor as $_id => $row){ 
    $sumWatts += $row['watts']; 
} 
$db->otherCollection->insert(array('sum' => $sumWatts, 'hour' => mktime(date('H'), 0, 0)))); 

這將所有行的時間正常化,當它被處理的整整一個小時。

雖然您也可以使用運算符$sum的聚合框架來完成此操作,將它讀入PHP並寫出來。

但是我認爲對於這種特定類型的聚合,在這段時間內,直接PHP可能更簡單,更容易,甚至可能更快。

如果你是聚集鉅額和許多領域,那麼我會說這樣做在MR可以超時運行等。