MongoDBで配列内のオブジェクトにアクセスする方法:ドット表記を使ったクエリ入門
MongoDBでは、配列内のオブジェクトにアクセスしたい場合にドット表記(dot notation)を使用します。この記事では、実際にコレクションを作成しながら、配列内のネストされたデータを検索する方法を解説します。
サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成しましょう。ここでは「details」というフィールドの中に、複数のオブジェクトが格納された配列を持つ構造を例にします。
> db.demo299.insertOne(
... {
... "id":100,
... "Name":"Robert",
... "details":[
... {
... "SubjectName":["C++","Python"]
... },
... {
... "SubjectName":["Spring","Hibernate"]
... }
... ]
... }
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4d685a5d93261e4bc9ea4b")
}
続けて、もう1件のドキュメントを挿入します。
> db.demo299.insertOne(
... {
... "id":101,
... "Name":"Adam",
... "details":[
... {
... "SubjectName":["Python","JSP"]
... },
... {
... "SubjectName":["Servlet","Operating System"]
... }
... ]
... }
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e4d685b5d93261e4bc9ea4c")
}
find()メソッドで全ドキュメントを表示
登録したデータを確認するために、find()メソッドを使ってコレクション内のすべてのドキュメントを表示してみましょう。
> db.demo299.find();
このクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5e4d685a5d93261e4bc9ea4b"), "id" : 100, "Name" : "Robert", "details" : [
{ "SubjectName" : [ "C++", "Python" ] },
{ "SubjectName" : [ "Spring", "Hibernate" ] }
]
}
{
"_id" : ObjectId("5e4d685b5d93261e4bc9ea4c"), "id" : 101, "Name" : "Adam", "details" : [
{ "SubjectName" : [ "Python", "JSP" ] }, { "SubjectName" : [ "Servlet", "Operating System" ] }
]
}
配列内のオブジェクトにアクセスするクエリ
それでは本題です。配列内のオブジェクトにアクセスするには、「親フィールド名.子フィールド名」の形式でドット表記を指定します。以下のクエリでは、detailsフィールド内のSubjectNameに「Servlet」という値が含まれるドキュメントを検索しています。
> db.demo299.find({"details.SubjectName":"Servlet"});
実行結果は次のとおりです。「Servlet」を含むのはid:101のドキュメントだけなので、該当する1件のみが返されます。
{
"_id" : ObjectId("5e4d685b5d93261e4bc9ea4c"), "id" : 101, "Name" : "Adam", "details" : [
{ "SubjectName" : [ "Python", "JSP" ] }, { "SubjectName" : [ "Servlet", "Operating System" ] }
]
}
ポイントまとめ
- 配列内のオブジェクトのフィールドを検索する場合は、
「配列フィールド名.オブジェクトのキー名」というドット表記を使用する。 - 条件に一致する要素が配列内のどの位置にあっても、MongoDBが自動的に探索してくれるため、インデックス番号を指定する必要はない。
- 特定の配列位置を厳密に指定したい場合のみ、
details.0.SubjectNameのように数値インデックスを付与する。
このようにドット表記を活用することで、深くネストされたドキュメント構造でもシンプルなクエリで柔軟にデータを取得できます。ぜひ実際のプロジェクトでも試してみてください。
-
MongoDBでサブドキュメントの配列をクエリする方法
MongoDBでサブドキュメントの配列をクエリするには、集計パイプラインの$unwindを使用します。$unwindは、配列フィールドを展開し、配列の各要素ごとに個別のドキュメントを生成するステージです。これにより、配列内のサブドキュメントを個別にフィルタリングできるようになります。ここでは、大学の情報を含むコレクションを作成し、その中から特定の条件に一致するサブドキュメントを抽出する手順を解説します。コレクションの作成まず、insertOne()メソッドを使って、サブドキュメントの配列を含むドキュメントを挿入しましょう。> db.demo499.insertOne({... "
-
MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ
MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..