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

MongoDBで少なくとも1つの要素が一致する場合に2つのリストを集約する方法

MongoDBで、配列内の少なくとも1つの要素が一致するドキュメント同士を集約(グループ化)したい場合があります。このようなケースでは、アグリゲーションパイプラインの $unwind$group$addToSet などの演算子を組み合わせることで実現できます。

本記事では、サンプルコレクションを作成し、共通の要素を持つドキュメントを集約する具体的な手順を解説します。

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

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

> db.demo456.insertOne(
... { _id: 101, StudentName: ["Chris", "David"] }
... );
{ "acknowledged" : true, "insertedId" : 101 }
>
> db.demo456.insertOne(
... { _id: 102, StudentName: ["Mike", "Sam"] }
... );
{ "acknowledged" : true, "insertedId" : 102 }
> db.demo456.insertOne(
... { _id: 103, StudentName: ["John", "Jace"] }
... );
{ "acknowledged" : true, "insertedId" : 103 }
> db.demo456.insertOne(
... { _id: 104, StudentName: ["Robert", "John"] }
... );
{ "acknowledged" : true, "insertedId" : 104 }

2. 登録されたドキュメントの確認

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

> db.demo456.find();

これにより、次の出力が得られます。

{ "_id" : 101, "StudentName" : [ "Chris", "David" ] }
{ "_id" : 102, "StudentName" : [ "Mike", "Sam" ] }
{ "_id" : 103, "StudentName" : [ "John", "Jace" ] }
{ "_id" : 104, "StudentName" : [ "Robert", "John" ] }

3. 少なくとも1つの要素が一致する場合にリストを集約するクエリ

以下は、配列内の少なくとも1つの要素が一致するドキュメントを集約するためのアグリゲーションクエリです。

> db.demo456.aggregate([
... {$unwind:"$StudentName"},
... {$group:{_id:"$StudentName", combine:{$addToSet:"$_id"}, size:{$sum:1}}},
... {$match:{size: {$gt: 1}}},
... {$project:{_id: 1, combine:1, size: 1, combine1: "$combine"}},
... {$unwind:"$combine"},
... {$unwind:"$combine1"},
... {$group:{_id:"$combine", l:{$first:"$_id"}, size:{$sum: 1}, set: {$addToSet:"$combine1"}}},
... {$sort:{size:1}},
... {$group:{_id: "$l", combineIds:{$last:"$set"}, size:{$sum:1}}},
... {$match: {size:{$gt:1}}}
... ])

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

{ "_id" : "John", "combineIds" : [ 103, 104 ], "size" : 2 }

処理の流れのポイント

  • $unwind: 配列フィールド「StudentName」を展開し、各要素ごとに個別のドキュメントを作成します。
  • $group + $addToSet: 同じ名前(要素)ごとにドキュメントの_idをまとめます。
  • $match: 複数のドキュメントにまたがる要素(size が 1 より大きいもの)だけを抽出します。
  • $sort: 結果を整理して最終的なグループ化を行いやすくします。

上記の出力から分かるように、「John」という要素は_id 103と104の両方のドキュメントに存在しているため、これら2つのリストが1つのグループとして集約されています。

  1. 【C#】2つのリストに共通する要素が存在するかどうかを確認するプログラム

    C#では、2つの配列やリストに共通する要素が存在するかどうかを、HashSetと比較演算子(== や <)を組み合わせて効率的に確認できます。この記事では、具体的な実装方法をサンプルコード付きで解説します。最初のリストの設定まず、比較対象となる最初のリスト(整数型の配列)を設定します。int[] arr1 = { 65, 57, 63, 98 };2つ目のリストの設定続いて、2つ目のリストを設定します。int[] arr2 = { 43, 65, 33, 57 };サンプルコード以下は、== 演算子と < 演算子を使っ

  2. Pythonで2つのリストに共通要素が存在するかを判定する方法【初心者向け解説】

    この記事では、ユーザーから入力された2つのリストを受け取り、それらの間に共通する要素が少なくとも1つ存在するかどうかを判定するPythonプログラムを紹介します。判定には、最もシンプルな「走査(トラバーサル)」という手法を使用します。具体的には、1つ目のリストと2つ目のリストを順番にたどりながら、各要素同士を比較していきます。 実行例 入力 : A = [10, 20, 30, 50] B = [90, 80, 30, 10, 3] 出力 : FOUND(共通要素あり) 入力 : A = [10, 20, 30, 50] B = [100, 200, 300,