2011-10-21 5 views
0

をマッピングするために、私は削減/マップに新しいですし、それに私の私の(遅い)アプリケーションロジックを実行する代わりに、削減/マップを使用して、以下のデータを収集する方法を把握しようとしている:どのように2つのMongoDBのコレクションを削減/

私はコレクション 'tasks'に1対nの関係を持つコレクション 'projects'を持っています。今度は、最初にプロジェクトが最も多く、最後にプロジェクトが最も少ないプロジェクト名を私に提供する一連の結果を受け取りたいと思います。

あるいはさらに良いまた、すべてのプロジェクトは、プロジェクト名は一意であると仮定すると(持っているどのように多くの作業を私に伝えハッシュの配列:マップの

[project_1: 23, project_2: 42, project_3: 82] 

を私はのようなものを試してみました:

map = function() { 
    emit(this.project_id, { count:1 }); 
} 

還元:

reduce = function (key, values) { 
    var sum = 0; 
    values.forEach(function(doc){ sum += 1; }); 
    return { count:sum }; 
} 

私はこれを私の仕事のコレクションに対して解雇しました:

var mr = db.tasks.mapReduce(map, reduce, { out: "results" }); 

しかし問い合わせるとき、私は重大な結果を得る:

db[mr.result].find(); 

を私はRailsの上Mongoidを使用していて、完全に失われています。誰かが私を正しい方向に向けることができますか?

Thxです。 フェリックス

答えて

2

は、一般的に右に見えるが、私は、少なくとも一つの問題を発見:関数は、還元前の製品そのものである値を減少することができるので、機能を減らすことで加算ステップは

values.forEach(function(doc){ sum += doc.count ; }); 

する必要がありますhttp://www.mongodb.org/display/DOCS/Troubleshooting+MapReduce

希望に役立ちます:ステップ、およびそれゆえ、ここで述べた一般的な監督、だ> 1.

カウント値を持っています!

関連する問題