MongoDBで$elemMatchを使ってネストされた配列を複数条件でクエリする方法
MongoDBでネストされた(入れ子になった)配列に対して複数の条件を指定してクエリを実行するには、$elemMatch 演算子を使用します。$elemMatch を使うことで、配列内の同一要素がすべての条件を満たす場合にのみドキュメントをマッチさせることができます。
この記事では、実際にコレクションを作成し、$elemMatch を使った複数条件クエリの実行手順を解説します。
1. サンプルコレクションの作成
まず、insertOne() メソッドを使ってドキュメントを挿入し、コレクションを作成します。この例では、従業員情報をネストした配列を持つドキュメントを作成します。
> db.demo203.insertOne({
... "_id" : "101",
... "Name" : "Chris",
... "details1" : [
... {
... "empName" : "David",
... "salary" : "50000",
... "technology" : [
... "MySQL",
... "MongoDB"
... ]
... },
... {
... "empName" : "Carol",
... "salary" : "70000",
... "technology" : [
... "Java",
... "Spring"
... ]
... }
... ]
... });
{ "acknowledged" : true, "insertedId" : "101" }上記のドキュメントでは、「details1」という配列フィールドの中に、従業員名(empName)、給与(salary)、使用技術(technology)を含むオブジェクトが格納されています。
2. find()メソッドですべてのドキュメントを表示
作成したコレクション内のすべてのドキュメントを確認するには、find() メソッドを使用します。
> db.demo203.find();
実行すると、以下のような出力が得られます。
{
"_id" : "101", "Name" : "Chris", "details1" : [
{ "empName" : "David", "salary" : "50000", "technology" : [ "MySQL", "MongoDB" ] },
{ "empName" : "Carol", "salary" : "70000", "technology" : [ "Java", "Spring" ] } ]
}3. $elemMatchで複数条件のクエリを実行
ここからが本題です。ネストされた配列に対して複数の条件を指定してクエリを実行するには、次のように $elemMatch を使用します。
> db.demo203.find(
... { details1: { $elemMatch: { "technology" : "MySQL", "empName" : "David" } } }
... ).pretty()このクエリでは、「details1 配列内の同じ要素において、technology が「MySQL」であり、かつ empName が「David」である」ドキュメントを検索しています。
実行結果は以下のとおりです。
{
"_id" : "101",
"Name" : "Chris",
"details1" : [
{
"empName" : "David",
"salary" : "50000",
"technology" : [
"MySQL",
"MongoDB"
]
},
{
"empName" : "Carol",
"salary" : "70000",
"technology" : [
"Java",
"Spring"
]
}
]
}$elemMatchを使うメリット
$elemMatch を使わずに通常のドット記法で条件を指定した場合、配列内の異なる要素にまたがって条件が評価される可能性があります。つまり、「empName が David の要素」と「technology が MySQL の要素」が別々の要素であってもマッチしてしまうことがあります。
$elemMatch を使用すれば、単一の配列要素内ですべての条件が同時に満たされることを保証できるため、ネストされた配列を扱う際の正確なデータ取得に不可欠な演算子です。
-
MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ
MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..
-
MongoDBで配列の要素を1つだけ取得する方法|$slice演算子の使い方
MongoDBの$sliceで配列の要素を1つだけ取得する配列から特定の件数の要素だけを取り出したい場合、MongoDBでは$slice演算子を使用します。$sliceはプロジェクション演算子の一種で、指定した件数分の配列要素のみを返すことができます。ここでは、実際にコレクションを作成し、$sliceを使って配列の先頭1件だけを取得する手順を順番に見ていきましょう。サンプルデータの作成まず、insertOne()メソッドを使ってドキュメントをコレクションに挿入します。> db.demo579.insertOne( ... { ... _id : 101, ...