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

MongoDBで2つの配列を$unwindで展開する方法

MongoDBで配列を展開(アンワインド)するには、集計パイプラインの $unwind 演算子を使用します。$unwind は入力ドキュメント内の配列フィールドを分解し、配列の各要素に対して1つのドキュメントを出力します。さらに includeArrayIndex オプションを組み合わせることで、2つの配列の要素をインデックス順にペアリングして取得することも可能です。

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

まず、ドキュメントを含むコレクションを作成しましょう。

> db.demo515.insertOne(
... {
...    "details1": [
...       "4700100004"
...    ],
...    "details2": [
...       "Not Given"
...    ],
...    "Value1": [
...       "56",
...       "45",
...       "35"
...    ],
...    "Value2": [
...       "35",
...       "45",
...       "56"
...    ]
... }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e889e51987b6e0e9d18f590")
}

ドキュメントの確認

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

> db.demo515.find();

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

{ "_id" : ObjectId("5e889e51987b6e0e9d18f590"), "details1" : [ "4700100004" ], "details2" : [ "Not Given" ], "Value1" : [ "56", "45", "35" ], "Value2" : [ "35", "45", "56" ] }

2つの配列を展開するクエリ

以下は、Value1Value2 の2つの配列を同時に展開するクエリです。ポイントは、$unwindincludeArrayIndex オプションで各要素のインデックス番号を保持し、$project で両方のインデックスが一致するかどうかを判定した後、$match で一致するドキュメントのみを抽出している点です。

> db.demo515.aggregate([
... { $unwind: { path: "$Value1", includeArrayIndex : "index1" } },
... { $unwind: { path: "$Value2", includeArrayIndex : "index2" } },
... { $project: {
...    _id : 1,
...    details1: 1,
...    details2: 1,
...    Value1: 1,
...    Value2: 1,
...    valid: { $eq: ["$index1", "$index2"] } }
... },
... { $match: { valid: true } }
... ]);

実行結果

このパイプラインを実行すると、2つの配列の同じ位置にある要素がペアになったドキュメントが出力されます。

{ "_id" : ObjectId("5e889e51987b6e0e9d18f590"), "details1" : [ "4700100004" ], "details2" : [ "Not Given" ], "Value1" : "56", "Value2" : "35", "valid" : true }
{ "_id" : ObjectId("5e889e51987b6e0e9d18f590"), "details1" : [ "4700100004" ], "details2" : [ "Not Given" ], "Value1" : "45", "Value2" : "45", "valid" : true }
{ "_id" : ObjectId("5e889e51987b6e0e9d18f590"), "details1" : [ "4700100004" ], "details2" : [ "Not Given" ], "Value1" : "35", "Value2" : "56", "valid" : true }

解説

上記の出力を見ると、Value1 の0番目の要素「56」が Value2 の0番目の要素「35」とペアになり、1番目同士、2番目同士もそれぞれ対応付けられていることがわかります。

なお、単純に $unwind を2回連続で適用すると、両配列の全要素の組み合わせ(クロス結合)が生成されるため、出力件数は「配列Aの要素数 × 配列Bの要素数」になります。そのため、includeArrayIndex で取得したインデックスを比較し、$match で絞り込むことで、実質的に配列同士をインデックス順に対応付ける(ZIPする)処理が実現できます。このテクニックは、複数の配列フィールドを行方向に展開して分析したい場合に非常に便利です。

  1. C#で2つの配列を1つに結合する方法

    C#では、List<T>のAddRange()メソッドを使うことで、複数の配列を簡単に1つの配列へ結合できます。この記事では、その具体的な手順をサンプルコード付きで解説します。 結合の手順 1. 配列を宣言・初期化する まず、結合対象となる2つの配列を宣言して初期化します。 int[] arr1 = { 37, 45, 65 }; int[] arr2 = { 70, 89, 118 }; 2. 新しいリストを作成する 次に、配列の要素を格納するための新しいリストを作成します。 var myList = new List<int>(); 3. AddRange()メソッ

  2. C#で2つの配列の共通要素(積集合)を取得する方法【Intersectメソッド】

    C#で2つの配列の共通要素(交差・積集合)を取得するには、Intersectメソッドを使用します。このメソッドは、System.Linq名前空間に用意されている拡張メソッドで、LINQを使った配列操作の中でも特に便利な機能の一つです。 Intersectメソッドは、2つの配列を比較し、両方に存在する共通の要素だけを返します。重複する要素は自動的に除外され、結果は一意な値のコレクションとして取得できます。 配列の準備 まず、比較対象となる2つの整数型の配列を定義します。 int[] arr1 = { 44, 76, 98, 34 }; int[] arr2 = { 24, 98, 44, 55,