MongoDBで配列の配列(ネストされた配列)をクエリする方法
MongoDBで配列の配列をクエリするには?
MongoDBで「配列の中に配列が格納されているデータ」(配列の配列)を検索するには、$in 演算子と $elemMatch 演算子を組み合わせて使用します。
この記事では、実際にサンプルコレクションを作成しながら、具体的なクエリの書き方を順番に解説していきます。
1. サンプルコレクションの作成
まずは、ドキュメントを含むコレクションを作成しましょう。ドキュメントの挿入には insertOne() メソッドを使用します。以下のクエリを実行します。
> db.arrayOfArraysDemo.insertOne({"EmployeeName":"Larry","EmployeeSkills":[["Java","MongoDB","MySQL","SQL Server"]]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f7a8d8d10a061296a3c5b")
}
> db.arrayOfArraysDemo.insertOne({"EmployeeName":"Mike","EmployeeSkills":[["C","C++"]]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c7f7aa68d10a061296a3c5c")
}この例では、「EmployeeSkills」フィールドに配列の配列としてスキル情報が格納されています。Larry のドキュメントには Java・MongoDB・MySQL・SQL Server、Mike のドキュメントには C・C++ というスキルが登録されています。
2. 登録済みドキュメントの確認
作成したすべてのドキュメントを表示するには、find() メソッドを使用します。読みやすく整形して表示するために pretty() も併せて指定します。
> db.arrayOfArraysDemo.find().pretty();
実行結果は以下のとおりです。
{
"_id" : ObjectId("5c7f7a8d8d10a061296a3c5b"),
"EmployeeName" : "Larry",
"EmployeeSkills" : [
[
"Java",
"MongoDB",
"MySQL",
"SQL Server"
]
]
}
{
"_id" : ObjectId("5c7f7aa68d10a061296a3c5c"),
"EmployeeName" : "Mike",
"EmployeeSkills" : [
[
"C",
"C++"
]
]
}3. 配列の配列をクエリする
それでは本題の、配列の配列から特定の値を持つドキュメントを検索するクエリを見ていきましょう。ポイントは、$elemMatch を二重にネストさせることです。外側の $elemMatch で外側の配列を評価し、内側の $elemMatch で内側の配列に対して $in による条件判定を行います。
ここでは「MongoDB」というスキルを持つ従業員を検索します。
> db.arrayOfArraysDemo.find({'EmployeeSkills':{$elemMatch:{$elemMatch:{$in:['MongoDB']}}}
}).pretty();実行結果は以下のとおりです。
{
"_id" : ObjectId("5c7f7a8d8d10a061296a3c5b"),
"EmployeeName" : "Larry",
"EmployeeSkills" : [
[
"Java",
"MongoDB",
"MySQL",
"SQL Server"
]
]
}このように、「MongoDB」を含むのは Larry のドキュメントだけであるため、該当する1件のみが出力されました。
まとめ
MongoDBで配列の配列をクエリする場合は、$elemMatch を二重にネストし、最も内側で $in 演算子による条件を指定するのが基本のパターンです。このテクニックを覚えておけば、階層化された配列構造のデータでも柔軟に検索できるようになります。
-
C言語の配列とは?宣言・初期化の基本をサンプルコードで解説
配列(Array)とは、同じ型の要素を連続したメモリ領域に格納したデータの集まりです。メモリ上の最も低いアドレスが先頭の要素に対応し、最も高いアドレスが末尾の要素に対応します。 配列のインデックス(添字)は0から始まり、配列サイズから1を引いた値(配列サイズ - 1)で終わります。また、配列のサイズは0より大きい整数でなければなりません。 配列のインデックスの例 具体的に例を見てみましょう。 配列サイズ = 10 の場合 配列の先頭インデックス = 0 配列の末尾インデックス = 配列サイズ - 1 = 10 - 1 = 9 C言語における配列の宣言 C言語で配列を宣言する構文は以下の通りで
-
C言語の多次元配列とは?行優先・列優先の仕組みとサンプルコード
多次元配列とは配列とは、同種のデータ(ホモジニアスなデータ)をまとめて管理するための基本的なデータ構造です。配列の要素は、メモリ上の連続した領域に順番に配置されます。しかし実際のプログラミングでは、1次元の配列だけでは不十分なケースが少なくありません。例えば、表形式のデータや行列を扱う場合には、2次元配列やさらに多くの次元を持つ多次元配列を作成する必要があります。行優先方式と列優先方式多次元配列をメモリ上に表現する方法には、大きく分けて2つのアプローチがあります。ひとつは行優先(Row-Major)方式、もうひとつは列優先(Column-Major)方式です。r行 c列の2次元配列を考えてみま