MongoDBで複数の配列要素を条件にドキュメントをフィルタリングする方法($elemMatch)
MongoDBで複数の配列要素を条件にフィルタリングするには?
配列内の複数のフィールド条件を組み合わせてドキュメントを絞り込みたい場合は、$elemMatch 演算子を使用します。$elemMatch を使うことで、「同じ配列要素の中で複数の条件がすべて一致する」ドキュメントのみを正確に抽出できます。
この記事では、実際にコレクションを作成しながら、$elemMatch によるフィルタリングの手順を具体的なコード例とともに解説します。
1. コレクションにドキュメントを挿入する
まず、サンプル用のコレクション demo87 を作成します。各ドキュメントは、従業員名(EmployeeName)と給与(Salary)からなる Details 配列を持っています。
> db.demo87.insertOne(
... {
... id:101,
... "Details": [
... {
... "EmployeeName": "Chris",
... "Salary": 45000
... },
... {
... "EmployeeName": "David",
... "Salary": 50000
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2c113871bf0181ecc422ab")
}
> db.demo87.insertOne(
... {
... id:102,
... "Details": [
... {
... "EmployeeName": "Chris",
... "Salary": 65000
... },
... {
... "EmployeeName": "Mike",
... "Salary": 100000
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2c114371bf0181ecc422ac")
}
2. find()メソッドですべてのドキュメントを確認する
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo87.find();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e2c113871bf0181ecc422ab"), "id" : 101, "Details" : [
{ "EmployeeName" : "Chris", "Salary" : 45000 },
{ "EmployeeName" : "David", "Salary" : 50000 }
]
}
{
"_id" : ObjectId("5e2c114371bf0181ecc422ac"), "id" : 102, "Details" : [
{ "EmployeeName" : "Chris", "Salary" : 65000 },
{ "EmployeeName" : "Mike", "Salary" : 100000 }
]
}
3. $elemMatchで複数の配列要素条件を指定してフィルタリングする
続いて、本題である「複数の配列要素によるフィルタリング」のクエリを見てみましょう。ここでは、EmployeeName が "Chris" かつ Salary が 65000 という条件を、同一の配列要素内で満たすドキュメントを検索します。
> db.demo87.find({ Details: { $elemMatch: { "EmployeeName": 'Chris', "Salary": 65000 }}});
実行すると、以下の出力が得られます。
{
"_id" : ObjectId("5e2c114371bf0181ecc422ac"), "id" : 102, "Details" : [
{ "EmployeeName" : "Chris", "Salary" : 65000 },
{ "EmployeeName" : "Mike", "Salary" : 100000 }
]
}
$elemMatchを使うメリット
もし { "Details.EmployeeName": "Chris", "Details.Salary": 65000 } のように通常の形式で条件を指定すると、異なる配列要素にまたがって条件が評価される可能性があります。つまり、「Chris」という名前の要素と「65000」という給与の要素が別々のオブジェクトに存在していてもマッチしてしまうのです。
$elemMatch を使えば、これらの条件が単一の配列要素内で同時に成立することが保証されるため、より厳密で意図通りの検索が可能になります。配列フィールドに対して複数条件で絞り込みを行う際は、$elemMatch の活用をぜひ覚えておきましょう。
-
MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ
MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..
-
MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法
MongoDBでネストされた配列をフィルタリングする基本アプローチMongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。> db.demo736.insertOne( ... { ... _id: