2012-04-13 9 views
0

mapreduceアルゴリズムの作成に問題があり、必要な統計情報を取得できません。投稿を作成できるユーザーオブジェクトがあり、投稿には他のユーザーが好きなものがたくさんあります。子オブジェクトのMapReduceは埋め込まれていません

ユーザー
--Post
は----

我々だけでユーザーコンテキストで別々にしていない記事にアクセスするためのポストはユーザーに埋め込まれていないが好きです。私が必要とする統計は、著者が得た好きな数であり、ユーザーの投稿のようなものを通してこれを取得する必要があります。問題は、投稿が埋め込まれていないため、マップ機能で投稿にアクセスできないということです。ここで私は現在だけなので、私もレベルまだではなく、数の同類にもらっていないユーザーごとに投稿を返す必要があります

def reputation_map 
<<-MAP 
    function() {  
     var posts = db.posts.find({user_id:this._id}); 
     emit(this._id, {posts:posts});  
    } 
MAP 
end 

def reputation_reduce 
    <<-REDUCE 
    function(key, values) { 
     var count = 0; 
     while(values.hasNext()){ 
     values.next(); 
     count+=1; 
     } 
     return {posts:count}; 
    } 
REDUCE 
end 

これを持っているマップであり、機能を減らすこと、これが唯一のポストのためのdbQueryタグを返します。 。これを行う正しい方法は何ですか?

+0

user_idあたりの好きな数(投稿内)。次に、必要に応じて、それらのuser_idをユーザーにマップします(別のクエリで)。 –

+0

私はそれらが埋め込まれていないので、mapreduceでそれらをどのように問い合わせるかわかりません。 – Slick86

+0

地図は、ユーザーではなく、投稿で縮小されます。次に、別のクエリ(map-reduceではない)で(必要な場合)拡張ユーザー情報を取得します。 –

答えて

1

マップReduceは実際には一度に1つのコレクションで動作するように設計されています。

技術的には、Map関数の内部から別のコレクションをクエリすることは技術的には可能ですが、推奨されておらずサポートされていないため注意が必要です。特にコレクションが断片化されている場合は、問題が発生する可能性があります。

同様の質問がしばらく前に頼まれた:How to call to mongodb inside my map/reduce functions? Is it a good practice?

あなたが複数のコレクションからの結果を集計している場合は、あなたがそれを行うには、最も安全でストレートフォワードな方法は、アプリケーションであることがあります。

また、作成者あたりのお気に入り数がある頻度で検索される値である場合は、各文書に値として含めることをお勧めします。この値を増やすために、著者ごとにすべての投票の潜在的に資源重い計算を定期的に実行するのではなく、

これは、必要な値を取得するための思考のためのいくつかの食糧を与えることを望みます。

単一のコレクションに対してMap Reduce操作を作成するための支援が必要な場合は、コミュニティが役立ちます。サンプル入力文書と希望する出力の説明を含めてください。地図の詳細については

削減、ドキュメントはここで見つけることができる: http://www.mongodb.org/display/DOCS/MapReduce

はまた、いくつかの良い地図がMongoDBのクックブックの例を減らしてあります http://cookbook.mongodb.org/

の「エクストラ」セクションには、クックブックの記事「バージョン付きドキュメントでの最大値と最小値の検索」http://cookbook.mongodb.org/patterns/finding_max_and_min/には、機能がどのように実行されるかを説明するマップリダクション操作のステップバイステップのウォークスルーが含まれています。

関連する問題