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

MongoDBで単一コレクション内のドキュメント間のセット共通部分(積集合)を求める方法

MongoDBで、同じコレクション内に保存された複数のドキュメントが持つ配列(セット)同士の共通要素を取得したい場合があります。そのようなときに活躍するのが、集計パイプラインで使える演算子 $setIntersection です。

この記事では、実際にデータを作成し、$setIntersection を使って2つのドキュメント間の共通部分を抽出する手順を解説します。

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

まず、insertOne() メソッドを使ってテスト用のコレクションを作成します。

> db.setInterSectionDemo.insertOne(
...    {"_id":101, "Value1":[55,67,89]}
... );
{ "acknowledged" : true, "insertedId" : 101 }
> db.setInterSectionDemo.insertOne(
...    {"_id":102, "Value2":[90,45,55]}
... );
{ "acknowledged" : true, "insertedId" : 102 }
> db.setInterSectionDemo.insertOne(
...    {"_id":103, "Value3":[92,67,45]}
... );
{ "acknowledged" : true, "insertedId" : 103 }

ここでは3つのドキュメントを作成しました。それぞれ異なるフィールド名(Value1、Value2、Value3)で数値の配列を持っています。

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

find() メソッドに pretty() を組み合わせると、登録済みの全ドキュメントを見やすく表示できます。

> db.setInterSectionDemo.find().pretty();

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

{ "_id" : 101, "Value1" : [ 55, 67, 89 ] }
{ "_id" : 102, "Value2" : [ 90, 45, 55 ] }
{ "_id" : 103, "Value3" : [ 92, 67, 45 ] }

3. $setIntersectionで共通部分を求める

続いて、aggregate() パイプラインを使って、ドキュメント _id が 101 と 103 の配列同士の共通部分を計算します。

> db.setInterSectionDemo.aggregate([
...    {
...       "$match": {
...          "_id": { "$in": [101, 103] }
...       }
...    },
...    {
...       "$group": {
...          "_id": 0,
...          "firstValue": { "$first": "$Value1" },
...          "secondValue": { "$last": "$Value3" }
...       }
...    },
...    {
...       "$project": {
...          "firstValue": 1,
...          "secondValue": 1,
...          "CommonValue": { "$setIntersection": [ "$firstValue", "$secondValue" ] },
...          "_id": 0
...       }
...    }
... ]);

パイプラインの各ステージのポイント

  • $match: 対象となるドキュメントを _id で絞り込みます。ここでは 101 と 103 を選択しています。
  • $group: 全ドキュメントを1つのグループにまとめ、$first と $last を使って Value1 と Value3 の配列を取り出します。
  • $project: 必要なフィールドだけを出力し、$setIntersection によって2つの配列の共通要素を CommonValue として生成します。

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

{ "firstValue" : [ 55, 67, 89 ], "secondValue" : [ 92, 67, 45 ], "CommonValue" : [ 67 ] }

結果の読み方

[55, 67, 89] と [92, 67, 45] の両方に含まれる値は 67 のみです。そのため、CommonValue には [ 67 ] が出力されました。

$setIntersection は、重複を排除した「数学的な集合」として配列を扱うため、順序や重複を気にせず正確な共通部分を得られるのが特徴です。タグ検索、権限チェック、カテゴリマッチングなど、配列フィールドを比較したいさまざまなシーンで応用できます。

  1. Javaを使ってMongoDBコレクションからすべてのドキュメントを取得する方法

    MongoDBでは、find()メソッドを使用することで、既存のコレクションからドキュメントを取得できます。この記事では、MongoDBシェルでの基本操作と、Javaプログラムからすべてのドキュメントを取得する手順について詳しく解説します。MongoDBシェルでの構文db.coll.find()各要素の意味は以下のとおりです。db:対象となるデータベースcoll:ドキュメントを取得したいコレクションの名前シェルでの実行例ここでは、MongoDBデータベース内に「students」というコレクションがあり、次のドキュメントが登録されているものとします。{name:"Ram",

  2. Javaを使ってMongoDBコレクションのドキュメントをソートする方法

    MongoDBコレクションからレコードを取得する際、結果として得られるドキュメントを特定のフィールドの値に基づいて並べ替え(ソート)したいケースはよくあります。MongoDBではsort()メソッドを使用することで、検索結果を昇順または降順に簡単に並べ替えることができます。基本構文MongoDBシェルでの基本的な構文は以下のとおりです。キーの値に「1」を指定すると昇順、「-1」を指定すると降順になります。db.COLLECTION_NAME.find().sort({KEY:1})Javaドライバでのsort()メソッドの使い方JavaのMongoDBライブラリにも同名のsort()メソッドが