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

MongoDBで配列の共通部分(交差)データを取得する方法

MongoDBで配列の共通部分を取得するには?

MongoDBで配列同士の共通要素(交差)を求めたい場合、集計パイプラインである aggregate() 内で $setIntersection 演算子を使用します。この演算子は、指定した複数の配列に共通して含まれる要素だけを抽出し、重複を除いた配列として返してくれます。

それでは、実際にドキュメントを含むコレクションを作成しながら確認していきましょう。

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

> db.demo625.insertOne(
...     {
...        Name: "John",
...        Marks: [56,98,60]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e9ab8e16c954c74be91e6aa")
}
> db.demo625.insertOne(
...     {
...        Name: "John",
...        Marks: [110,56,72]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e9ab8e26c954c74be91e6ab")
}
> db.demo625.insertOne(
...     {
...        Name: "Chris",
...        Marks: [90,91]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e9ab8e26c954c74be91e6ac")
}
> db.demo625.insertOne(
...     {
...        Name: "Robert",
...        Marks: [60,75]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e9ab8e26c954c74be91e6ad")
}

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

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

> db.demo625.find();

上記のコマンドを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e9ab8e16c954c74be91e6aa"), "Name" : "John", "Marks" : [ 56, 98, 60 ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ab"), "Name" : "John", "Marks" : [ 110, 56, 72 ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ac"), "Name" : "Chris", "Marks" : [ 90, 91 ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ad"), "Name" : "Robert", "Marks" : [ 60, 75 ] }

3. $setIntersection を使った配列交差の取得

以下のクエリでは、各ドキュメントの Marks フィールドと基準となる配列 [56,98,60] の共通部分を $setIntersection によって計算しています。

> db.demo625.aggregate([
...
...
...     { "$project": {
...       "Name": 1,
...       "Marks": {
...          "$setIntersection": [ "$Marks", [56,98,60] ]
...       }
...     }}
... ])

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

{ "_id" : ObjectId("5e9ab8e16c954c74be91e6aa"), "Name" : "John", "Marks" : [ 56, 60, 98 ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ab"), "Name" : "John", "Marks" : [ 56 ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ac"), "Name" : "Chris", "Marks" : [ ] }
{ "_id" : ObjectId("5e9ab8e26c954c74be91e6ad"), "Name" : "Robert", "Marks" : [ 60 ] }

結果のポイント

  • 最初のドキュメント「John」は [56,98,60] をそのまま持っているため、すべての要素(56・60・98)が共通部分として返されています。
  • 2番目の「John」の [110,56,72] との共通要素は 56 のみです。
  • 「Chris」の [90,91] には一致する要素がないため、空の配列が返されます。
  • 「Robert」の [60,75] との共通要素は 60 のみです。

なお、$setIntersection は集合演算を行うため、結果の配列には重複した要素は含まれず、要素の順序も元の配列と異なる場合がある点に注意してください。特定の値を持つドキュメントだけをフィルタリングしたい場合は、この後に $match ステージを組み合わせることで柔軟に対応できます。

  1. MongoDBの配列に追加・連結するには?$concatArrays演算子の使い方

    MongoDBで配列を追加・連結するには?MongoDBで配列に別の配列を追加(連結)したい場合には、集計(アグリゲーション)フレームワークの$concatArrays演算子を使用します。$concatArraysは、複数の配列を1つに結合した新しい配列を返す演算子で、MongoDB 3.2以降で利用可能です。この記事では、実際にコレクションを作成し、「FirstName」と「LastName」という2つの配列フィールドを$concatArraysで連結するまでの手順を、サンプルコードとともに解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってドキュメントを

  2. MongoDBのオブジェクト配列からアイテムを取得する方法

    MongoDBでオブジェクト配列からアイテムを取得するには?MongoDBのドキュメント内にネストされたオブジェクト配列から特定のアイテムを取り出したい場合は、aggregate()メソッドを使用します。集計パイプラインの各ステージを組み合わせることで、配列の展開・絞り込み・集約を柔軟に行えます。まずは、サンプルコレクションにドキュメントを作成してみましょう。> db.demo459.insertOne( ... { _id : 1, ... Information : [ ... { ... Name : Chris, ... _id : new O