MongoDBでfind()と$elemMatchを使って配列の値を取得する方法
MongoDBで配列の値を取得するには?
MongoDBでは、find()メソッドと$elemMatch演算子を組み合わせることで、ネストされた配列の中から条件に合う値を効率的に取得できます。$elemMatchは、配列内の要素が指定した複数の条件をすべて満たすかどうかを判定するために使われる演算子です。
この記事では、実際にコレクションを作成し、ネストした配列構造を持つドキュメントから目的のデータを取り出す手順を具体的な例とともに解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使って、学生情報を格納したドキュメントを含むコレクションを作成します。
> db.fetchingArrayValuesDemo.insertOne(
... {
... "StudentName": "David",
... "StudentDetails": [
... {
... "FatherName": "Bob",
... "CountryName": "US",
... "Favourite": [
... {
... "Teacher": "DAVID",
... "Subject": [
... "MySQL",
... "MongoDB",
... "Java"
... ],
... "Marks": [50, 60, 65]
... }
... ]
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06fc3425ddae1f53b621fa")
}続けて、2つ目のドキュメントも挿入します。
> db.fetchingArrayValuesDemo.insertOne(
... {
... "StudentName": "Robert",
... "StudentDetails": [
... {
... "FatherName": "Sam",
... "CountryName": "AUS",
... "Favourite": [
... {
... "Teacher": "MIKE",
... "Subject": [
... "Python",
... "C",
... "C++"
... ],
... "Marks": [76, 89, 91]
... }
... ]
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06fc6825ddae1f53b621fb")
}2. すべてのドキュメントを確認する
find()メソッドを実行すると、コレクション内のすべてのドキュメントを表示できます。
> db.fetchingArrayValuesDemo.find();
このクエリを実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5e06fc3425ddae1f53b621fa"), "StudentName" : "David", "StudentDetails" : [ { "FatherName" : "Bob", "CountryName" : "US", "Favourite" : [ { "Teacher" : "DAVID", "Subject" : [ "MySQL", "MongoDB", "Java" ], "Marks" : [ 50, 60, 65 ] } ] } ] }
{ "_id" : ObjectId("5e06fc6825ddae1f53b621fb"), "StudentName" : "Robert", "StudentDetails" : [ { "FatherName" : "Sam", "CountryName" : "AUS", "Favourite" : [ { "Teacher" : "MIKE", "Subject" : [ "Python", "C", "C++" ], "Marks" : [ 76, 89, 91 ] } ] } ] }3. $elemMatchを使って配列の値を取得する
それでは、本題である配列の値を取得するクエリを見ていきましょう。ここでは、「Teacher」フィールドが「DAVID」と一致する要素を含むドキュメントを検索します。配列が入れ子になっているため、$elemMatchを多段階でネストして指定している点に注目してください。
> db.fetchingArrayValuesDemo.find({
... StudentDetails:{
... $elemMatch: {
... Favourite: {
... $elemMatch: {
... Teacher: "DAVID"
... }
... }
... }
... }
... });このクエリを実行すると、以下のように該当するドキュメントのみが出力されます。
{ "_id" : ObjectId("5e06fc3425ddae1f53b621fa"), "StudentName" : "David", "StudentDetails" : [ { "FatherName" : "Bob", "CountryName" : "US", "Favourite" : [ { "Teacher" : "DAVID", "Subject" : [ "MySQL", "MongoDB", "Java" ], "Marks" : [ 50, 60, 65 ] } ] } ] }まとめ
ネストされた配列を含むドキュメントから特定の値を検索する場合は、find()メソッドに対して$elemMatchを階層ごとに適用することで、正確に目的のデータを抽出できます。この手法は、学生情報や注文履歴など、複雑な階層構造を持つデータを扱う際に非常に役立ちます。
-
MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ
MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "