3

現在、さまざまな間隔(1〜5秒)で電力測定値(ワット)をMongoDB 2.2に記録しています(db->モニタリング-> kWh)。私のコレクション内のデータは以下のようにパッケージ化されています。

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

情報を1時間ごとに集計する必要があるため、1時間の開始から終了までのすべてのワット数を合計し、1時間の読み取り値の数で割ります。PHPを使用して、この結果をMongoDB内の新しいコレクションにプッシュできるようにする必要があります。もちろんこれはcronジョブとして実行できますが、挿入の一部としてこれを実行するメカニズムはありますか?

datetimeフィールドはUnixタイムスタンプです。

4

1 に答える 1

1

これは、次のような放出機能を備えたMRで簡単に行うことができます。

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

ここhourに示すような方法を使用して、行が処理された時間の正規化された時間(以下の私のPHPスニペットに示されている)がある変数があります:javascriptで日付をタイムスタンプに変換しますか?または、のPHPcronjobから外部変数を渡すこともできますmktime()

非常に単純なreduceを実行してそれらを合計し、MRを呼び出すPHPcronjobから実行されるメインの1時間ごとの集計コレクションに対してを実行しますoutmerge

ただし、これはこの種のことにはちょっとやり過ぎのようです。個人的には、次のように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で行うと言います。

于 2012-10-03T10:01:51.693 に答える