2011-01-28 11 views
1

私は効率的に解決する方法がわからないという問題があります。私は(それぞれの日のための多くの文書があることができ、毎日のためにnumber_of_hitsの合計を取得する必要がありMongoDBを使用して効率的な方法であるコレクションから別のコレクションへデータを集計する方法は?

stats = { 
    'day': '', 
    'total_number_of_hits': 0 
    'user_id': 0 
    ... 
    some other stuff 
} 

1)

hits = { 
    'day': '', 
    'number_of_hits': 0 
    'user_id': 0 
} 

2):

は、私は2つのコレクションを持っていますさまざまなヒット数を含む を含む)、これらの合計で統計情報のコレクションをできるだけ早く更新できます。 これはヒットコレクション内の各user_idに対して行う必要があります

ヒットコレクションの集計を取得してから、ループ更新統計コレクション。

しかし、何かが良い方法ではないと私に伝えています。

また、統計コレクションには数日間ドキュメントがない場合があるので、更新する代わりに を作成する必要があります。

あなたは私に、それは素晴らしいだろう任意のアイデア:)

を得ることができる場合PabloX

答えて

3

が再設計あなたが

stats{ 
    'day': '', 
    'user_id': 0, 
    'hits':{ 
     // Array of your hits document 
    } 
} 

ような構造とのみ取得しようとすることができ、 をありがとうすべてのヒットを含む1つの文書。合計はいつでも計算できます。

+0

面白いアイデア、ありがとう:)私は、単一の文書が4〜8メガバイトの上に行くことができることを心配しています制限する。しかし、私はヒットが収集される方法を変えることができると思うので、おそらく限界が問題になることはないと思います。 – pablox

+0

これにより、データベースへの接続数も減少します。 –

+0

あなたのソリューションは非常にうまく動作します。ありがとうございました:) – pablox

0

あなたの問題は、Mongoのマップ/リダクション機能の古典的なケースのようです。詳細はhttp://www.mongodb.org/display/DOCS/MapReduceを参照してください。

map/reduceで気になることが1つあります。私が使用しているMongoのバージョン(1.4.5)では、map/reduceを実行すると、すべての読者とライターをロックアウトするデータベースのロックが取得されます。新しいバージョンのMongoではそれがまだ問題であるかどうかはわかりません。

0

もう1つの考え方は、$ inc演算子を使った更新です。 基本的に、user_idとdateに一致するドキュメントが存在する場合は、ヒットを1つ増やします。

すべてのヒットを記録する必要がない限り、これは最も効率的な方法です。

私はこれはPythonで行われているかどうかはわかりませんけど、モンゴのドキュメントをチェックアウト:

http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc

関連する問題