MongoDB-MapReduce

MongoDBのドキュメントによると、 Map-reduceは、大量のデータを有用な集計結果に凝縮するためのデータ処理パラダイムです。MongoDBはmapReducemap-reduce操作のコマンド。MapReduceは通常、大きなデータセットを処理するために使用されます。

MapReduceコマンド

以下は、基本的なmapReduceコマンドの構文です。

>db.collection.mapReduce(
   function() {emit(key,value);},  //map function
   function(key,values) {return reduceFunction}, {   //reduce function
      out: collection,
      query: document,
      sort: document,
      limit: number
   }
)

map-reduce関数は、最初にコレクションにクエリを実行し、次に結果ドキュメントをマップしてキーと値のペアを出力します。次に、複数の値を持つキーに基づいて縮小されます。

上記の構文では-

  • map 値をキーにマップし、キーと値のペアを出力するJavaScript関数です。

  • reduce 同じキーを持つすべてのドキュメントを削減またはグループ化するJavaScript関数です

  • out map-reduceクエリ結果の場所を指定します

  • query ドキュメントを選択するためのオプションの選択基準を指定します

  • sort オプションのソート基準を指定します

  • limit 返されるドキュメントのオプションの最大数を指定します

MapReduceの使用

ユーザーの投稿を保存する次のドキュメント構造について考えてみます。ドキュメントには、ユーザーのuser_nameと投稿のステータスが保存されます。

{
   "post_text": "tutorialspoint is an awesome website for tutorials",
   "user_name": "mark",
   "status":"active"
}

次に、mapReduce関数を使用します posts コレクションを使用してすべてのアクティブな投稿を選択し、user_nameに基づいてグループ化し、次のコードを使用して各ユーザーによる投稿の数をカウントします-

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
	
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
)

上記のmapReduceクエリは次の結果を出力します-

{
   "result" : "post_total",
   "timeMillis" : 9,
   "counts" : {
      "input" : 4,
      "emit" : 4,
      "reduce" : 2,
      "output" : 2
   },
   "ok" : 1,
}

結果は、合計4つのドキュメントがクエリに一致し(ステータス:「アクティブ」)、map関数がキーと値のペアを持つ4つのドキュメントを発行し、最後にreduce関数が同じキーを持つマップされたドキュメントを2にグループ化したことを示しています。

このmapReduceクエリの結果を確認するには、検索演算子-を使用します

>db.posts.mapReduce( 
   function() { emit(this.user_id,1); }, 
   function(key, values) {return Array.sum(values)}, {  
      query:{status:"active"},  
      out:"post_total" 
   }
	
).find()

上記のクエリは、両方のユーザーが tom そして mark アクティブな状態の2つの投稿がある-

{ "_id" : "tom", "value" : 2 }
{ "_id" : "mark", "value" : 2 }

同様に、MapReduceクエリを使用して、大規模で複雑な集計クエリを作成できます。カスタムJavascript関数を使用すると、非常に柔軟で強力なMapReduceが使用されます。