Mongodb-map-reduce
MongoDB-マップ削減
MongoDBのドキュメントによると、 Map-reduce は、大量のデータを有用な集計結果に凝縮するためのデータ処理パラダイムです。 MongoDBは、map-reduce操作に mapReduce コマンドを使用します。 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": "finddevguides 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つのドキュメントがクエリ(ステータス:「アクティブ」)に一致し、マップ関数がキーと値のペアを持つ4つのドキュメントを発行し、最後にリデュース関数が同じキーを持つマップされたドキュメントを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を使用します。