2011-12-04 6 views
0

は、私はすべての販売が含まれており、状態によって、このMongoDBの複雑なマップ/削減 - またはので、私は最後に、

{_id: '999', buyer:{city:'Dallas','state':'Texas',...}, products: {...}, order_value:1000, date:"2011-11-23T11:34:33Z" } 私は受注量に関する統計情報を表示する必要が

のように見えるのMongoDBのコレクションを持っていると思います30,60、および90日間。 ので、あなたは、単一のクエリでこれを行うだろうか、この

 
State   Last 30  Last 60  Last 90 
Arizona  12000   22000  35000 
Texas   5000   9000  16000 

のようなものを取得しますか?

答えて

0

は非常に難しいことではありません。

map = function() { 
    emit({key : this.buyer.state, value : order_value}) 
} 

reduce = function(key,values) { 
    sum = 0; 
    values.forEach(function(o) { 
     sum += o 
     } 
    return sum 
    } 

、その後、クエリであなたのコレクションを減らすマップ{日付:{$ GT:{[今日マイナス30日]}} (I D'ONT構文を覚えていますmongodbサイトの優れたmapreduce文書を参照してください)。

マップをより効率的に使用するには、incremental map reduceと最後の30日間クエリを実行してから、もう一度reduce(インクリメンタル)フィルタリング-60〜-30日を実行して、t60日間の情報を取得します。最後に、増分マップを実行して、最後の90日間を取得するために-60〜-90日のフィルタリングを減らします。

3つのクエリがあるが、まだ持っていないデータの集計だけを再計算するので、これは悪くありません。

私は例を挙げることができますが、今は自分で行うことができます。

+0

でも、30,60,90を1つのクエリで取得できますか? –

+0

@CatalinMそれはもっと複雑ですが不可能ではありません。より複雑なreduce関数を作成しなければなりません(また、日付値を含むマップでより複雑なキーを使用する必要があります)。しかし、私は3マップの削減を実行することをお勧めします。 1つのクエリを実行する理由はありますか? – kamaradclimber

+0

@CatalinMパフォーマンスがなぜonyクエリーをしたいのか:1つのクエリーでそれを行う唯一の解決策は、非常にjavascript形式で非常に遅い(少なくとも3マップを減らすことよりもはるかに多い)。増分マップを減らすこともできると私の更新された答えを参照してください。 – kamaradclimber