【MongoDB】$elemMatch演算子で配列内の複数条件に一致するドキュメントを検索する方法
MongoDBで、配列内の要素に対して複数の条件を同時に一致させてドキュメントを検索したい場合は、アグリゲーションフレームワークと $elemMatch 演算子を組み合わせて使用します。この記事では、従業員情報を格納した配列から「氏名」と「使用言語」の両方が一致するドキュメントを抽出する手順を、実際のコード例とともにわかりやすく解説します。
1. サンプルコレクションの作成
まず、insertOne() メソッドを使って、EmployeeDetails という配列フィールドを持つコレクションを作成しましょう。
> db.matchMultipleCriteriaDemo.insertOne({
"EmployeeDetails": [
{"EmployeeName": "Chris", "Salary": 45000, "Language":"Java"},
{"EmployeeName": "Robert", "Salary": 41000, "Language":"Python"}
]
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cea3bf0ef71edecf6a1f689")
}
> db.matchMultipleCriteriaDemo.insertOne({
"EmployeeDetails": [
{"EmployeeName": "David", "Salary": 55000, "Language":"C++"},
{"EmployeeName": "Bob", "Salary": 61000, "Language":"C"}
]
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cea3bf1ef71edecf6a1f68a")
}
2. 登録されたドキュメントの確認
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.matchMultipleCriteriaDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cea3bf0ef71edecf6a1f689"),
"EmployeeDetails" : [
{
"EmployeeName" : "Chris",
"Salary" : 45000,
"Language" : "Java"
},
{
"EmployeeName" : "Robert",
"Salary" : 41000,
"Language" : "Python"
}
]
}
{
"_id" : ObjectId("5cea3bf1ef71edecf6a1f68a"),
"EmployeeDetails" : [
{
"EmployeeName" : "David",
"Salary" : 55000,
"Language" : "C++"
},
{
"EmployeeName" : "Bob",
"Salary" : 61000,
"Language" : "C"
}
]
}
3. $elemMatchで配列内の複数条件に一致させる
それでは本題です。配列内の要素に対して複数の条件(この例では EmployeeName が "Bob" かつ Language が "C")を指定して一致させるには、$match ステージで $elemMatch を使用します。
> db.matchMultipleCriteriaDemo.aggregate({ "$match": { "EmployeeDetails": { "$elemMatch": { "EmployeeName": "Bob", "Language":"C" } } }} ).pretty();
実行すると、条件を満たすドキュメントのみが出力されます。
{
"_id" : ObjectId("5cea3bf1ef71edecf6a1f68a"),
"EmployeeDetails" : [
{
"EmployeeName" : "David",
"Salary" : 55000,
"Language" : "C++"
},
{
"EmployeeName" : "Bob",
"Salary" : 61000,
"Language" : "C"
}
]
}
$elemMatchを使うべき理由
「EmployeeDetails.EmployeeName」と「EmployeeDetails.Language」をそれぞれ個別の条件として指定した場合、「Bob という名前の要素」と「C という言語の要素」が別々の配列要素に存在していてもマッチしてしまう可能性があります。一方、$elemMatch を使えば同じ1つの配列要素の中ですべての条件が満たされた場合のみ一致と判定されるため、より厳密な検索が可能になります。
なお、$elemMatch は aggregate() の $match ステージだけでなく、通常の find() のクエリでも同様に使用できます。
まとめ
- 配列内の同一要素に対する複数条件の一致には $elemMatch 演算子を使用する
- find() のクエリでも、aggregate() の $match ステージでも利用可能
- 別々の要素にまたがる意図しない一致を防ぎたい場合に特に有効
-
MongoDBで配列の一致を検索するには?$all演算子の使い方を解説
MongoDBで配列フィールドに対して複数の要素がすべて含まれているかどうかを確認したい場合、$all 演算子を使用します。$all演算子は、指定したすべての要素を配列に含むドキュメントだけを選択するためのクエリ演算子です。この記事では、実際のコレクションを作成しながら、$all演算子を使った配列一致検索の手順を具体的に見ていきましょう。サンプルコレクションの作成とインデックス設定まず、ドキュメントを格納するコレクションを作成し、「ListOfSubject」フィールドにインデックスを設定します。> db.demo668.createIndex({ListOfSubject:1}); {
-
MongoDBで配列フィールドに対して$allを使って全要素に一致させる方法
配列フィールドの全要素に一致させるには MongoDBで配列内のすべての指定要素を含むドキュメントを検索したい場合には、$all 演算子を使用します。$all は、対象フィールドの値が配列であり、その配列が指定した要素をすべて含んでいるドキュメントだけを選択するクエリ演算子です。 ここでは、サンプルコレクションを作成し、実際に $all を使った検索手順を順番に見ていきましょう。 1. コレクションへのドキュメント登録 まずは insertOne() メソッドを使って、サンプルコレクション「demo695」にドキュメントを挿入します。 > db.demo695.insertOne({L