MongoDBの地図削減
地図-削減は、単に作業(データ)分解(MAP)の大部分は実行し、最終結果(REDUCE)に結果をマージすることを意味し、コンピューティング・モデルです。
MongoDBのは、削減マップは、大規模データ解析のために非常に柔軟で提供することも非常に実用的です。
MapReduceのコマンド
以下は、MapReduceの基本的な構文は次のとおりです。
>db.collection.mapReduce( function() {emit(key,value);}, //map 函数 function(key,values) {return reduceFunction}, //reduce 函数 { out: collection, query: document, sort: document, limit: number } )
2つの関数は、地図と機能を削減達成するために、MapReduceの機能を使用して、マップ関数呼び出しは(キー、値)を放出する、すべてのレコードでコレクションを横断し、キーの値は、処理のために減らし関数に渡されます。
マップ機能は、ペアを返します(キー、値)を放出呼び出す必要があります。
パラメータ説明:
- マップ:マッピング関数(関数のパラメータを減らすなどのキーシーケンスを生成します)。
- 統計関数を減らす 、タスクは、単一の値値への値の配列であるキー値、にファンクションキーの値を減少させることです。 。
- 統計結果出セット(クライアントが切断された後、自動的に削除一時的なコレクションの使用を指定しないでください)保存されています。
- クエリのフィルタ条件、文書のみの条件を満たすためには、map関数と呼ぶことにします。(Query.limit、ソート混在させることができます)
- ソートパラメータソート結合ソートと限界(ソートするためにmap関数に送られ、また元の文書)には、グループ化メカニズムを最適化することができます
- map関数の上限に送信されたドキュメントの数(制限がない場合は、ほとんど役に立たないの単独の一種)を制限
MapReduceのを使用してください
ユーザーの記事、ドキュメントを格納するために、次の文書構造を考慮して、ユーザーuser_name記事のステータスフィールドを格納します。
>db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"active" }) WriteResult({ "nInserted" : 1 })
、および各ユーザー投稿のために計算されたuser_nameのパケットによって:今、私たちは(「アクティブ」状態)掲載された記事を選択するために、MapReduceの機能設定の記事を使用します。
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } )
MapReduceの出力を上回っています。
{ "result" : "post_total", "timeMillis" : 23, "counts" : { "input" : 5, "emit" : 5, "reduce" : 1, "output" : 2 }, "ok" : 1 }
結果は、4の合計は、クエリの条件に一致することが示された(ステータス:「アクティブ」)の文書は、文書内のmap関数の4つのキーを生成し、その後、2つのグループに分け、キーを削減するために同じ関数を使用します。
特定のパラメータ:
- 結果は:コレクションの名前の結果を格納、これは削除されているバックのMapReduceの自動接続オフの一時的なセットです。
- timeMillis:実行はミリ秒単位で、時間がかかります
- 入力:文書の条件数は、マップ機能に送られ、
- 放出マップ関数EMITの時刻が呼び出され、それは、すべてのデータ収集の合計量であります
- ouputを:コレクション内のドキュメントの結果数(カウントはデバッグのために非常に便利です)
- OK:成功、成功1
- ERR:それが失敗した場合、失敗する理由があるかもしれませんが、経験から、理由が曖昧で、非常に有用ではありません
のクエリ結果のMapReduceを表示するには、検索演算子を使用します:
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find()
上記のクエリの結果が公開された2論文がトム2人のユーザーがあるとマークし、次のようになります。
{ "_id" : "mark", "value" : 4 } { "_id" : "w3big", "value" : 1 }
同様に、MapReduceは、大規模で複雑な集約クエリを構築するために使用することができます。
map関数とreduce関数は、JavaScriptが、MapReduceのは非常に柔軟で強力なを使用することが使用して実装することができます。