MongoDBで配列要素をフィルタリングする方法:$setIntersection演算子の使い方
MongoDBで配列内の要素をフィルタリングしたい場合、アグリゲーションフレームワークと$setIntersection(集合交差)演算子を組み合わせることで実現できます。$setIntersectionは、2つの配列を受け取り、両方に共通して存在する要素のみを返す演算子です。
サンプルコレクションの作成
まずは、スコアの配列を持つドキュメントを含むコレクションを作成してみましょう。
> db.filterArrayElementsDemo.insertOne( { "Scores": [10,45,67,78,90,98,99,92] } );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd2d582b64f4b851c3a13c8")
}登録したドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.filterArrayElementsDemo.find().pretty();
上記のクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5cd2d582b64f4b851c3a13c8"),
"Scores" : [
10,
45,
67,
78,
90,
98,
99,
92
]
}配列要素をフィルタリングするクエリ
次に、aggregate()メソッドの中で$matchステージと$projectステージを組み合わせ、$setIntersectionを使って特定の要素だけを抽出します。ここでは「10」「98」「99」の3つの値に絞り込んでみましょう。
> db.filterArrayElementsDemo.aggregate([
... { $match : {
... _id: ObjectId("5cd2d582b64f4b851c3a13c8")
... }},
... { $project: {
... Scores: {
... $setIntersection: ['$Scores', [10,98,99]]
... }
... }}
... ]);実行結果は以下の通りです。元の配列から指定した要素のみが抽出されていることが確認できます。
{ "_id" : ObjectId("5cd2d582b64f4b851c3a13c8"), "Scores" : [ 10, 98, 99 ] }ポイントまとめ
- $match:対象となるドキュメントを絞り込みます(ここでは_idで指定)。
- $project:出力するフィールドを整形します。
- $setIntersection:元の配列と指定した配列の共通要素のみを返します。
この手法を使えば、条件に合致する配列要素だけを効率的に取得できるため、大量のデータが格納された配列から必要な値だけを取り出したい場合に非常に便利です。
-
MongoDBで配列の要素を削除するには?$pull演算子の使い方を解説
MongoDBで配列から要素を削除する基本MongoDBで配列内の要素を削除したい場合は、$pull演算子を使用します。$pullは、既存の配列から指定した値、または条件に一致するすべてのインスタンスを取り除くための更新演算子です。この記事では、実際にコレクションを作成し、ネストされた配列から特定の要素を削除する手順を順番に解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。ここでは「software」フィールドの中に「services」という配列を持つドキュメントを挿入します。db.demo541.insertOne({software:{servic
-
MongoDBアグリゲーションで配列内の要素サブセットを合計する方法
MongoDBのアグリゲーションパイプラインを使用して、配列内の一部の要素(サブセット)を合計したい場合があります。そんなときは、$first演算子と$sum演算子を組み合わせることで実現できます。この記事では、実際のコレクションを作成しながら、具体的な手順をサンプルコード付きでわかりやすく解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下の例では、数値の配列「Values」を持つドキュメントをinsertOne()メソッドで挿入しています。> db.demo610.insertOne({Values:[10,20,30,40,50]}