MongoDBで配列内の複数条件に一致するドキュメントを取得する方法($elemMatchの使い方)
MongoDBでは、配列フィールドの中にある複数の条件を同時に満たす要素を持つドキュメントを検索したいケースがよくあります。このような場合には、aggregate()メソッドと$elemMatch演算子を組み合わせるのが効果的です。本記事では、実際のコード例と実行結果をもとに、その具体的な手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使って、従業員情報を配列として持つドキュメントをコレクションに登録します。
> db.demo84.insertOne({
... "EmployeeDetails": [
... {Name: 'John', Salary:45000, isMarried: true},
... {Name: 'Chris', Salary:50000, isMarried: false}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2c0a3471bf0181ecc422a5")
}
> db.demo84.insertOne({
... "EmployeeDetails": [
... {Name: 'Sam', Salary:56000, isMarried: false},
... {Name: 'Bob', Salary:50000, isMarried: false}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2c0a4071bf0181ecc422a6")
}
2. コレクション内の全ドキュメントを確認する
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo84.find();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e2c0a3471bf0181ecc422a5"), "EmployeeDetails" : [
{ "Name" : "John", "Salary" : 45000, "isMarried" : true },
{ "Name" : "Chris", "Salary" : 50000, "isMarried" : false }
]
}
{
"_id" : ObjectId("5e2c0a4071bf0181ecc422a6"), "EmployeeDetails" : [
{ "Name" : "Sam", "Salary" : 56000, "isMarried" : false },
{ "Name" : "Bob", "Salary" : 50000, "isMarried" : false }
]
}
3. 配列内の複数条件に一致させるクエリ
ここからが本題です。aggregate()の$matchステージ内で$elemMatchを使用すると、「同じ配列要素の中で複数の条件がすべて成立する」ドキュメントのみを抽出できます。
例:名前が「Chris」かつ未婚(isMarried: false)の要素を検索
> db.demo84.aggregate(
... { "$match": {
... "EmployeeDetails": {
... "$elemMatch": {
... "Name": "Chris",
... "isMarried": false
... }
... }
... }}
... );
実行結果は以下のとおりです。
{
"_id" : ObjectId("5e2c0a3471bf0181ecc422a5"), "EmployeeDetails" : [
{ "Name" : "John", "Salary" : 45000, "isMarried" : true },
{ "Name" : "Chris", "Salary" : 50000, "isMarried" : false }
]
}
ポイント解説
- $elemMatchの役割: 通常のクエリ条件では、複数の条件が「別々の配列要素」にまたがってマッチしてしまう可能性があります。
$elemMatchを使えば、単一の要素内ですべての条件が満たされていることが保証されます。 - $matchステージ:
aggregate()パイプラインの最初に$matchを置くことで、インデックスを活用しつつ効率的にフィルタリングできます。 - 出力について: マッチしたドキュメント全体が返されるため、必要に応じて
$projectステージを追加して、該当する配列要素だけを取り出すことも可能です。
このように、aggregate()と$elemMatchを組み合わせれば、配列内の複雑な条件検索もシンプルかつ正確に実現できます。
-
MongoDBでオブジェクトの配列内の複数条件に一致するドキュメントを検索する方法($andと$regex活用)
MongoDBでオブジェクト(サブドキュメント)の配列内から、複数の条件を同時に満たすドキュメントを検索したい場合は、$and演算子と$regex演算子、さらに$elemMatchを組み合わせるのが効果的です。$andは、1つ以上の式からなる配列に対して論理AND演算を実行し、配列内のすべての条件を満たすドキュメントだけを選択します。また、$elemMatchを使うことで、配列内の同一要素が複数条件を満たすかどうかを正確に判定できます。サンプルコレクションの作成まず、検証用のコレクションを作成してドキュメントを挿入してみましょう。> db.demo525.insertOne({detai
-
MongoDBで配列フィールドに対して$allを使って全要素に一致させる方法
配列フィールドの全要素に一致させるには MongoDBで配列内のすべての指定要素を含むドキュメントを検索したい場合には、$all 演算子を使用します。$all は、対象フィールドの値が配列であり、その配列が指定した要素をすべて含んでいるドキュメントだけを選択するクエリ演算子です。 ここでは、サンプルコレクションを作成し、実際に $all を使った検索手順を順番に見ていきましょう。 1. コレクションへのドキュメント登録 まずは insertOne() メソッドを使って、サンプルコレクション「demo695」にドキュメントを挿入します。 > db.demo695.insertOne({L