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

MongoDBで配列フィールドを使ってドキュメントをフィルタリングする方法($elemMatch演算子の使い方)

MongoDBで配列内の要素に基づいてドキュメントをフィルタリングしたい場合、$elemMatch 演算子を使用します。$elemMatch は、指定した条件を満たす要素を少なくとも1つ含む配列フィールドを持つドキュメントを照合するための演算子です。

この記事では、実際にコレクションを作成し、$elemMatch を使って配列条件でドキュメントを絞り込む手順を解説します。

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

まず、テスト用のコレクションにドキュメントを挿入してみましょう。ここでは、学生の名前と点数(Marks)を持つ details 配列を含むドキュメントを作成します。

> db.demo453.insertOne(
... { _id: 101, details: [ { Name: "David", Marks: 60 }, { Name: "Mike", Marks: 55} ] }
... )
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo453.insertOne(
... { _id: 102, details: [ { Name: "Bob", Marks: 80 }, { Name: "Sam", Marks: 78} ] }
... )
{ "acknowledged" : true, "insertedId" : 102 }
> db.demo453.insertOne(
... { _id: 103, details: [ { Name: "Carol", Marks: 67 }, { Name: "John", Marks: 79} ] }
... )
{ "acknowledged" : true, "insertedId" : 103 }

登録済みドキュメントの確認

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

> db.demo453.find();

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

{ "_id" : 101, "details" : [ { "Name" : "David", "Marks" : 60 }, { "Name" : "Mike", "Marks" : 55 } ] }
{ "_id" : 102, "details" : [ { "Name" : "Bob", "Marks" : 80 }, { "Name" : "Sam", "Marks" : 78 } ] }
{ "_id" : 103, "details" : [ { "Name" : "Carol", "Marks" : 67 }, { "Name" : "John", "Marks" : 79 } ] }

$elemMatch を使ったフィルタリングクエリ

それでは本題です。配列内の要素に基づいてドキュメントをフィルタリングするには、次のように $elemMatch を使用します。この例では、「Marks が75以上の要素を1つでも持つドキュメント」だけを抽出しています。

> db.demo453.find(
... { details: { $elemMatch: {Marks: { $gte: 75 } } } }
... )

実行結果は以下のとおりです。

{ "_id" : 102, "details" : [ { "Name" : "Bob", "Marks" : 80 }, { "Name" : "Sam", "Marks" : 78 } ] }
{ "_id" : 103, "details" : [ { "Name" : "Carol", "Marks" : 67 }, { "Name" : "John", "Marks" : 79 } ] }

結果の解説

出力を見ると、_id: 101 のドキュメントは除外されています。これは、このドキュメントの details 配列内の全要素(David: 60点、Mike: 55点)が75点未満であり、$elemMatch の条件「Marks が75以上」を満たす要素が1つも存在しないためです。

一方、_id: 102 と _id: 103 のドキュメントは、それぞれ80点・78点、79点という75以上の要素を配列内に持っているため、検索結果に含まれています。

まとめ

$elemMatch を使うことで、配列内の単一の要素に対して複数の条件を適用しながらドキュメントを正確にフィルタリングできます。単純なドット記法(例:"details.Marks": { $gte: 75 })では異なる要素にまたがって条件が評価される場合がありますが、$elemMatch は同じ要素内で条件を評価するため、より厳密な照合が必要な場面で特に有効です。

  1. MongoDBで配列の要素を削除するには?$pull演算子の使い方を解説

    MongoDBで配列から要素を削除する基本MongoDBで配列内の要素を削除したい場合は、$pull演算子を使用します。$pullは、既存の配列から指定した値、または条件に一致するすべてのインスタンスを取り除くための更新演算子です。この記事では、実際にコレクションを作成し、ネストされた配列から特定の要素を削除する手順を順番に解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。ここでは「software」フィールドの中に「services」という配列を持つドキュメントを挿入します。db.demo541.insertOne({software:{servic

  2. MongoDBで配列内の一致オブジェクト数に基づいてドキュメントを検索する方法

    MongoDBでは、$where演算子とJavaScript関数を組み合わせることで、配列内に存在する一致したオブジェクトの数に基づいてドキュメントを検索できます。この記事では、具体的なサンプルを通じてその方法を解説します。サンプルデータの準備まずは、ドキュメントを含むコレクションを作成しましょう。> db.demo694.insertOne( ... { ... details : ... [ ... { ... Name : Chris, ... Age:21 ...