MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBでmap-reduceを実装する方法をサンプルコード付きで解説

Map-Reduceとは

Map-Reduceは、大量のデータを有用な集計結果へと凝縮するためのデータ処理パラダイムです。MongoDBではmapReduce()メソッドを使用することで、コレクション内のドキュメントに対して柔軟な集計処理を実行できます。

本記事では、実際にサンプルデータを作成しながら、MongoDBでmap-reduceを実装する具体的な手順を順番に見ていきましょう。


サンプルコレクションの作成

まずは、ドキュメントを格納するコレクションを作成します。以下のようにinsertOne()メソッドを使って、顧客名(CustomerName)と結婚歴(isMarried)の情報を持つドキュメントを挿入していきます。

> db.demo280.insertOne({"CustomerName":"Chris","isMarried":true});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e49116edd099650a5401a62")
}
> db.demo280.insertOne({"CustomerName":"Mike","isMarried":false});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e491170dd099650a5401a63")
}
> db.demo280.insertOne({"CustomerName":"David","isMarried":false});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e491170dd099650a5401a64")
}
> db.demo280.insertOne({"CustomerName":"Bob","isMarried":true});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e491171dd099650a5401a65")
}

登録したドキュメントの確認

find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。

> db.demo280.find();

このコマンドを実行すると、以下のような出力が得られます。

{ "_id" : ObjectId("5e49116edd099650a5401a62"), "CustomerName" : "Chris", "isMarried" : true }
{ "_id" : ObjectId("5e491170dd099650a5401a63"), "CustomerName" : "Mike", "isMarried" : false }
{ "_id" : ObjectId("5e491170dd099650a5401a64"), "CustomerName" : "David", "isMarried" : false }
{ "_id" : ObjectId("5e491171dd099650a5401a65"), "CustomerName" : "Bob", "isMarried" : true }

mapReduceの実装方法

続いて、MongoDBでmapReduceを実装するクエリを見ていきましょう。map関数ではemit()を使ってキーと値を出力し、reduce関数でその値を合計します。ここでは「isMarriedがtrueであるドキュメント」のみを対象に集計を行い、結果を「Output」という新しいコレクションに出力します。

> db.demo280.mapReduce(
...   function() { emit(this.isMarried,true); },
...
...   function(key, values) {return Array.sum(values)}, {
...      query:{isMarried:true},
...      out:"Output"
...   }
...)

実行結果の確認

上記のクエリを実行すると、以下のような統計情報が出力されます。「input: 2」はクエリに一致した2件のドキュメントが処理対象となったこと、「emit: 2」はmap関数から2つの結果が出力されたことを示しています。

{
   "result" : "Output",
   "timeMillis" : 1241,
   "counts" : {
      "input" : 2,
      "emit" : 2,
      "reduce" : 1,
      "output" : 1
   },
   "ok" : 1
}

countsの各項目の意味

  • input: 処理対象となったドキュメントの総数
  • emit: map関数から値が出力された回数
  • reduce: reduce関数が呼び出された回数
  • output: 最終的に出力先コレクションへ書き込まれたドキュメント数

まとめ

MongoDBのmapReduceを活用すれば、queryオプションで対象ドキュメントを絞り込みながら、map関数とreduce関数を組み合わせて自由度の高い集計処理を実現できます。大量データの集計が必要な場面では、ぜひ本記事の手順を参考にしてみてください。

  1. MongoDBの_idフィールドを非表示にする方法

    MongoDBの_idフィールドを非表示にする方法MongoDBでは、find()メソッドでドキュメントを検索すると、デフォルトで_idフィールド(ObjectId)が必ず結果に含まれます。しかし、射影(プロジェクション)という仕組みを使えば、この_idフィールドを非表示にし、必要なフィールドだけを取得することが可能です。本記事では、具体的な手順をサンプルコード付きで解説します。1. コレクションとドキュメントの作成まず、サンプル用のコレクションを作成し、ドキュメントを挿入します。> db.demo575.insertOne({id:101, Information:{Name:&quo

  2. MongoDBで複数ドキュメントを一括挿入する方法(insertManyの使い方)

    MongoDBで大量のデータを一度に登録したい場合は、insertMany()メソッドを使用します。insertMany()を使うことで、1回のコマンド実行でコレクションに複数のドキュメントをまとめて挿入できます。サンプルコレクションの作成まずは、複数のドキュメントを含むコレクションを作成してみましょう。以下の例では、「demo729」というコレクションに、銀行名・カード種別・顧客情報を含む3件のドキュメントを挿入しています。> db.demo729.insertMany( [ ...    { BankName:"HDFC Bank",