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

MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法

MongoDBでネストされた配列をフィルタリングする基本アプローチ

MongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。

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

まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。

> db.demo736.insertOne(
...     {
...        "_id": "101",
...        "details1": [
...           {
...              "details2": [
...                 {
...                    "details3": {
...                       "Name": "John"
...                    }
...                 }
...              ]
...           }
...        ]
...    }
... );
{ "acknowledged" : true, "insertedId" : "101" }
> db.demo736.insertOne(
...     {
...        "_id": "102",
...        "details1": [
...           {
...              "details2": [
...                 {
...                    "details3": {
...                       "Name": "Robert"
...                    }
...                 }
...              ]
...           }
...        ]
...    }
... );
{ "acknowledged" : true, "insertedId" : "102" }

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

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

> db.demo736.find();

実行すると、以下のような出力が得られます。

{ "_id" : "101", "details1" : [ { "details2" : [ { "details3" : { "Name" : "John" } } ] } ] }
{ "_id" : "102", "details1" : [ { "details2" : [ { "details3" : { "Name" : "Robert" } } ] } ] }

3. 3階層の埋め込みドキュメントをフィルタリングするクエリ

以下が、MongoDBで3階層の埋め込みドキュメントの配列をフィルタリングするクエリです。$unwindを2回適用してdetails1とdetails1.details2の配列をそれぞれ展開し、その後$matchで「Robert」という名前を持つドキュメントだけを抽出しています。

> db.demo736.aggregate([
...    {
...       "$unwind": "$details1"
...    },
...    {
...       "$unwind": "$details1.details2"
...    },
...    {
...       "$match": {
...          "details1.details2.details3.Name": "Robert"
...       }
...    },
...    {
...       $project: {
...          _id: 0,
...          Name: "$details1.details2.details3",
...       }
...    }
... ])

このパイプラインを実行すると、次の出力が得られます。

{ "Name" : { "Name" : "Robert" } }

各ステージのポイント解説

  • $unwind: 配列フィールドを要素ごとの個別ドキュメントに分解するステージです。details1とdetails1.details2の2段階で適用することで、深くネストされた配列構造をフラット化できます。
  • $match: 指定した条件に一致するドキュメントのみを後続のステージへ渡すフィルタリング処理です。ここではdetails3.Nameが「Robert」であるものを対象としています。
  • $project: 出力結果に含めるフィールドを制御します。_idを0(非表示)に設定し、details3オブジェクトをNameとして出力しています。

このように、aggregate()パイプラインを活用すれば、何階層にもネストされた配列データでも柔軟にフィルタリングや整形を行うことが可能です。複雑なドキュメント構造を扱う際は、$unwind → $match → $project の組み合わせを覚えておくと非常に便利です。

  1. MongoDBで配列内の要素を指定して特定のドキュメントを取得する方法

    MongoDBのfind()でドット表記を使った特定ドキュメントの取得MongoDBで配列内に格納されたフィールドの値を条件に、特定のドキュメントだけを取得したい場合は、find()メソッドとドット表記(dot notation)を組み合わせるのが基本です。この記事では、実際のコード例を通して、その手順をわかりやすく解説します。1. サンプルコレクションとドキュメントの作成まずはテスト用のコレクションを作成し、配列の中にオブジェクトを持つドキュメントを挿入してみましょう。insertOne()メソッドを使用して、以下のように3件のドキュメントを登録します。> db.demo672.ins

  2. MongoDBで埋め込みドキュメント(配列内のサブドキュメント)をクエリする方法

    MongoDBの埋め込みドキュメントをクエリするには?MongoDBでは、ドキュメントの中に配列として埋め込まれたサブドキュメントをクエリする場合、aggregate()メソッドを使用するのが効果的です。この記事では、$unwindと$matchを組み合わせて、埋め込みドキュメントから条件に合うデータを抽出する手順を解説します。1. サンプルコレクションの作成まずは、学生情報を配列として持つドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使ってドキュメントを挿入します。> db.demo705.insertOne( ... { ...