0

Android アプリで動作する MongoDB データベースを構築しています。ユーザー コレクションとレコード コレクションがあります。記録ドキュメントは、開始座標と終了座標、合計時間、最高速度と距離などの GPS トラックで構成されます。ユーザー文書には、ユーザー ID、名、姓などがあります。

現在までの合計距離、合計時間、合計平均速度、および最高速度を要約した、各ユーザーの集計統計が必要です。

map reduce を実行してユーザーの集計コレクションを作成する必要があるのか​​、それとも、ある種の cron ジョブ タイプのソリューションを使用してこれらの統計をユーザー ドキュメントに追加する必要があるのか​​、私は混乱しています。MongoDB のマップ削減と集計に関する多くのガイドを読みましたが、これを理解できません。

ありがとう!

4

1 に答える 1

0

集計インジケーター値はユーザーごとのようです。その場合、現在の座標や速度などを更新すると同時に、それらを計算してユーザーオブジェクトに直接プッシュします。それらは素晴らしく簡単です(必要に応じて、それらをさらに集約することもできます。

事前計算とは、バッチ プロセスとして使用する MapReduce を意味するのではなく、単にユーザー オブジェクトの更新時に計算することを意味します。

集計統計がユーザー全体でコンパイルされている場合は、更新時にそれらを事前に計算することもできますが、これらの集計統計を他の条件またはフィルターに対してクエリできる必要がある場合は、「合計距離を教えてください」 x 地域内のすべてのユーザーが旅行した」という場合、組み合わせの数によっては、事前計算ですべてをカバーできない場合があります。

したがって、集計統計がユーザー全体であり、何らかのフィルターを適用する必要がある場合は、データのスナップショットから計算する必要があります。ここでの 2 つのアプローチは次のとおりです。

  1. 2.2 の集計フレームワーク
  2. MapReduce

たとえば、クランチしたい履歴データが大量にあり、後ですばやく読み取るために結果を事前に計算できる場合は、 MapReduceを使用する必要があります。私の定義では、そのデータは頻繁には変更されませんが、変更されたとしても、インクリメンタル MR を使用して新しい結果を既存の計算に追加することもできます。

2.2 の集約フレームワークを使用すると、この多くをオンデマンドで実行できますが、もちろん、事前に計算された値ほど速くはありませんが、オンデマンドで実行すると MR よりもはるかに高速になります。MR で実行できる大量の結果セットには対応できませんが、パラメーター値が事前にわからないクエリには適しています。

例として、特定の緯度/経度内のユーザー統計の総和を計算したい場合、MR は使用できません。そのフィルターの組み合わせが多すぎるためです。飛ぶ。

ただし、都市ごとに必要な場合は、限られた都市のセットに固執し、それらすべてを事前に計算するだけでよいため、そこで MR を使用できると考えられます。

まとめると、集計インジケーターの値がユーザーごとのものである場合は、最初の段落で述べたように、ユーザー オブジェクトを更新するときに、ユーザー オブジェクト内の値を計算して格納することから始めます。はい、入力だけでなく値も保存していますが、それはオンザフライで計算する必要がなくなるモデルです。

于 2012-10-11T14:45:59.427 に答える