English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

MongoDB mapReduceコマンド

MongoDBドキュメントによると、Map reduceは大量のデータを有用な集約結果に圧縮するためのデータ処理パラダイムです。MongoDBはmapReduceコマンドを使用してmap reduce操作を行います。MapReduceは通常、大規模データセットの処理に使用されます。

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 返すべきオプションの最大ドキュメント数を指定します

MapReduceを使用して

以下は、ユーザーのポストを保存するドキュメントの構造を考慮します。このドキュメントはユーザーの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を利用し、非常に柔軟で強力です。