0

必要な統計情報を取得するmapreduceアルゴリズムの作成に問題があります。投稿を作成できるユーザーオブジェクトがあり、投稿には他のユーザーからのいいねがたくさんあります。

ユーザー
-投稿
----いいね

ユーザーコンテキストだけでなく、投稿に個別にアクセスするため、投稿はユーザーに埋め込まれません。私が必要とする統計は、著者が取得したいいねの数であり、ユーザーの投稿のいいねを介してこれを取得する必要があります。問題は、投稿が埋め込まれていないため、マップ関数でそれらにアクセスできないことです。これが私が現在持っているマップとリデュース機能です

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のみを返します。これを行う正しい方法は何ですか?

4

1 に答える 1

1

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

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

同様の質問がしばらく前に尋ねられました: 私のmap / reduce関数内でmongodbを呼び出す方法は?それは良い習慣ですか?

複数のコレクションからの結果を集約している場合、それを行うための最も安全で最も簡単な方法はアプリケーションにあることに気付くかもしれません。

または、作成者ごとのいいねが一定の頻度で検索される値である場合は、定期的に実行するよりも、各ドキュメントに値として含め、更新ごとに少しオーバーヘッドをかけてこの値を増やす方が望ましい場合があります。著者ごとのすべての投票の潜在的にリソースを大量に消費する計算。

うまくいけば、これはあなたが必要とする値を取得するための思考のためのいくつかの食べ物をあなたに与えるでしょう。

単一のコレクションに対してMapReduce操作を作成するための支援が必要な場合は、コミュニティがお手伝いします。サンプルの入力ドキュメントと、必要な出力の説明を含めてください。

Map Reduceの詳細については、次のドキュメントを参照してください: http ://www.mongodb.org/display/DOCS/MapReduce

さらに、MongoDBクックブックにはいくつかの優れたMapReduceの例があります:http: //cookbook.mongodb.org/

クックブックの記事「バージョン管理されたドキュメントを使用した最大値と最小値の検索」の「Extras」セクションhttp://cookbook.mongodb.org/patterns/finding_max_and_min/には、MapReduce操作の優れたステップバイステップのウォークスルーが含まれています。関数が実行されます。

于 2012-04-13T18:32:05.763 に答える