MongoDBで配列内オブジェクトのフィールドを特定の値でクエリする方法($elemMatch活用)
MongoDBでは、$elemMatch演算子を使用することで、配列内のオブジェクトが持つフィールドを特定の値で検索できます。この記事では、基本構文からサンプルコレクションの作成、実際のクエリ実行結果まで、手順を追ってわかりやすく解説します。
基本構文
配列内のオブジェクトのフィールドに対して条件を指定してクエリを実行するには、次の構文を使用します。
db.yourCollectionName.find({"yourOuterFieldName": { $elemMatch: { "yourInnerFieldName": "yourValue" } } } ).pretty();
$elemMatchは、配列内の要素(この場合はオブジェクト)が指定した条件に一致するかどうかを判定するための演算子です。外側のフィールド名には配列を持つフィールドを、内側のフィールド名にはオブジェクト内のプロパティを指定します。
サンプルコレクションの作成
それでは、実際にドキュメントを含むコレクションを作成して動作を確認しましょう。まず、insertOne()メソッドを使ってドキュメントを挿入します。
> db.objectInAnArrayDemo.insertOne({ "StudentDetails": [{
"StudentName": "John", "StudentMessage": "Hi"}, {"StudentName": "Larry", "StudentMessage": "Hello"}]})
{
"acknowledged" : true,
"insertedId" : ObjectId("5c92635d36de59bd9de06381")
}
> db.objectInAnArrayDemo.insertOne({ "StudentDetails": [{
"StudentName": "Carol", "StudentMessage": "Hello"}, {"StudentName": "David", "StudentMessage": "Good Morning"}]})
{
"acknowledged" : true,
"insertedId" : ObjectId("5c92637936de59bd9de06382")
}
この例では、学生の名前(StudentName)とメッセージ(StudentMessage)を持つオブジェクトを、StudentDetailsという配列フィールドに格納しています。
登録済みドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.objectInAnArrayDemo.find().pretty();
実行結果は以下のとおりです。
{
"_id" : ObjectId("5c92635d36de59bd9de06381"),
"StudentDetails" : [
{
"StudentName" : "John",
"StudentMessage" : "Hi"
},
{
"StudentName" : "Larry",
"StudentMessage" : "Hello"
}
]
}
{
"_id" : ObjectId("5c92637936de59bd9de06382"),
"StudentDetails" : [
{
"StudentName" : "Carol",
"StudentMessage" : "Hello"
},
{
"StudentName" : "David",
"StudentMessage" : "Good Morning"
}
]
}
$elemMatchを使ったクエリの実行
それでは、配列内のオブジェクトのフィールド「StudentMessage」が「Good Morning」という値に一致するドキュメントを検索してみましょう。
> db.objectInAnArrayDemo.find({"StudentDetails": { $elemMatch: { "StudentMessage": "Good Morning" } } } ).pretty();
実行結果は以下のとおりです。
{
"_id" : ObjectId("5c92637936de59bd9de06382"),
"StudentDetails" : [
{
"StudentName" : "Carol",
"StudentMessage" : "Hello"
},
{
"StudentName" : "David",
"StudentMessage" : "Good Morning"
}
]
}
まとめ
このように、MongoDBで配列内のオブジェクトのフィールドを特定の値で検索したい場合は、$elemMatch演算子を使うことで簡単に実現できます。条件に一致したドキュメントは、その配列全体ごと返される点に注意してください。なお、配列内の一致した要素だけを取得したい場合は、集計フレームワーク(aggregate)の$filter演算子なども検討するとよいでしょう。
-
【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方
MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "