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

MongoDBでmapReduce()を使って入力要素から2番目の要素を集約する方法

MongoDBで入力要素から2番目の要素を集約したい場合、mapReduce()メソッドを活用するのが効果的です。Map-Reduceは、大量のデータを有用な集計結果へと凝縮するためのデータ処理パラダイムであり、柔軟な集計ロジックを実装できる強力な仕組みです。

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

まずは、ドキュメントを格納したコレクションを作成しましょう。以下のクエリを実行して、demo621というコレクションに4件のドキュメントを挿入します。

> db.demo621.insert({ _id: 101, Name1: "John", Name2: "John" });
WriteResult({ "nInserted" : 1 })
> db.demo621.insert({ _id: 102, Name1: "Bob", Name2: "John" });
WriteResult({ "nInserted" : 1 })
> db.demo621.insert({ _id: 103, Name1: "Chris", Name2: "John" });
WriteResult({ "nInserted" : 1 })
> db.demo621.insert({ _id: 104, Name1: "Sam", Name2: "John" });
WriteResult({ "nInserted" : 1 })

挿入したドキュメントの確認

find()メソッドを使えば、コレクション内のすべてのドキュメントを簡単に確認できます。

> db.demo621.find();

上記のクエリを実行すると、次のような出力が得られます。

{ "_id" : 101, "Name1" : "John", "Name2" : "John" }
{ "_id" : 102, "Name1" : "Bob", "Name2" : "John" }
{ "_id" : 103, "Name1" : "Chris", "Name2" : "John" }
{ "_id" : 104, "Name1" : "Sam", "Name2" : "John" }

2番目の要素を集約するmapReduceクエリ

続いて、入力要素から2番目の要素(偶数番目のドキュメント)を抽出・集約するためのmapReduceクエリを見ていきましょう。

> db.demo621.mapReduce(
...     function () {
...        track++;
...        var actualId= this._id;
...        delete this._id;
...        if ( track % div == 0 )
...        emit(actualId, this );
...     },
...     function() {},
...     {
...        "scope": { "track": 0, "div": 2 },
...        "out": { "inline": 1 }
...     }
... )

このクエリのポイントは、scopeオプションで変数track(カウンター)とdiv(除数)を初期化している点です。map関数内でtrackをインクリメントし、trackがdiv(ここでは2)で割り切れるタイミングでのみemit()を実行することで、2番目・4番目といった偶数番目のドキュメントだけが出力されます。また、処理中に_idフィールドを一時的に削除し、その値をactualIdとして保持することで、元のドキュメントIDを結果に引き継いでいます。

実行結果の確認

上記のmapReduceを実行すると、以下のような結果が出力されます。

{
    "results" : [
       {
          "_id" : 102,
          "value" : {
             "Name1" : "Bob",
             "Name2" : "John"
          }
       },
    {
       "_id" : 104,
       "value" : {
          "Name1" : "Sam",
          "Name2" : "John"
       }
    }
],
"timeMillis" : 48,
"counts" : {
    "input" : 4,
    "emit" : 2,
    "reduce" : 0,
    "output" : 2
},
"ok" : 1
}

結果を見ると、_idが102(Bob)と104(Sam)のドキュメント、つまり2番目と4番目の要素だけが抽出されていることがわかります。countsセクションではinputが4件に対してemitが2件、outputも2件となっており、意図した通りの動作が確認できます。divの値を変更すれば、3番目ごと、5番目ごとなど、任意の間隔で要素を抽出することも可能です。

  1. MongoDBのアグリゲーションで$redact演算子を使う方法

    $redact演算子とはMongoDBの$redactステージは、ドキュメント自体に格納されている情報に基づいて、各ドキュメントの内容を制限(フィルタリング)するための機能です。アグリゲーションフレームワークでは、$cond演算子を$redactと組み合わせることで、条件に応じてドキュメントを保持($$KEEP)するか除外($$PRUNE)するかを柔軟に制御できます。ここでは、実際のコード例を通して、$redactの基本的な使い方を見ていきましょう。サンプルコレクションの作成まず、insertOne()メソッドを使って、複数のドキュメントを含むコレクションを作成します。> db.demo

  2. MongoDBのAggregateでドキュメントと配列要素の平均値を取得する方法

    MongoDBでドキュメントのフィールドおよび配列内の各要素の平均値を求めるには、aggregate()メソッドと$groupステージを組み合わせ、平均を計算する$avg演算子を使用します。ここでは、実際にサンプルコレクションを作成しながら、具体的な手順を解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。 > db.demo598.insertOne( ...    { ...       Information:Student, ...   &