これは、次のような放出機能を備えたMRで簡単に行うことができます。
function(){
emit(hour, {count: this.watts});
}
ここhour
に示すような方法を使用して、行が処理された時間の正規化された時間(以下の私のPHPスニペットに示されている)がある変数があります:javascriptで日付をタイムスタンプに変換しますか?または、のPHPcronjobから外部変数を渡すこともできますmktime()
。
非常に単純なreduceを実行してそれらを合計し、MRを呼び出すPHPcronjobから実行されるメインの1時間ごとの集計コレクションに対してを実行しますout
。merge
ただし、これはこの種のことにはちょっとやり過ぎのようです。個人的には、次のように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))));
これにより、すべての行の時間が処理されたときの1時間に正規化されます。
演算子を使用して集約フレームワークを使用して$sum
これを完了することもできますが、PHPに読み込んでから、書き出すこともできます。
ただし、この特定のタイプの集計では、この期間中、この単一のフィールドの場合、PHPはおそらくより単純で簡単であり、おそらくさらに高速であると思います。
あなたが膨大な量と多くのフィールドを集約しているなら、私はこれを残業などを実行できるMRで行うと言います。