English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
MongoDBドキュメントによると、Map reduceは大量のデータを有用な集約結果に圧縮するためのデータ処理パラダイムです。MongoDBはmapReduceコマンドを使用してmap reduce操作を行います。MapReduceは通常、大規模データセットの処理に使用されます。
以下は基本的なmapReduceコマンドの文法です-
>db.collection.mapReduce( function() {emit(key,value);}, //map関数 function(key,values) {return reduceFunction}, { //reduce関数 out: collection, query: document, sort: document, limit: number } )
map-reduce関数はまずコレクションをクエリし、結果ドキュメントをマッピングしてキーを発行します-値対を出力し、複数の値を持つキーに基づいてそれを減少させます。
上記の文法では-
map
は、キーを値にマッピングし、キーを発行するjavascript関数です-値対
reduce
は、同じキーを持つすべてのドキュメントを減少またはグループ化するためのjavascript関数です
out
mapを指定します-reduceクエリ結果の場所を指定します
query
ドキュメントを選択するオプションの選択基準を指定します
sort
オプションのソート条件を指定します
limit
返すべきオプションの最大ドキュメント数を指定します
以下は、ユーザーのポストを保存するドキュメントの構造を考慮します。このドキュメントはユーザーのuser_nameと投稿状態を保存しています。
{ "post_text": "w"3codebox is an awesome website for tutorials" "user_name": "mark" "status":"active" }
今、以下でposts
集合上でmapReduce関数を使用して、すべてのアクティブなポストを選択し、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ドキュメントがクエリに一致(status: "active")すると、map関数が4キー値対を持つドキュメントが、最終的にreduce関数が同じキーを持つマッピングドキュメントを分類します2件。}}
このmapReduceクエリの結果を確認するには、find演算子を使用してください-
>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がアクティブなステータスのpostが2つあることを示しています–
{"_id" : "tom", "value" : 2 } {"_id" : "mark", "value" : 2 }
同様に、MapReduceクエリは、大規模で複雑なアググレーションクエリの構築に使用できます。カスタムJavaScript関数の使用はMapReduceを利用し、非常に柔軟で強力です。