MongoDBで配列内にネストされたドキュメントを持つドキュメントを検索する方法
MongoDBでは、配列の中に別のドキュメント(ネストされたドキュメント)が含まれている場合でも、find()メソッドとドット記法(dot notation)を組み合わせることで、目的のドキュメントを簡単に抽出できます。この記事では、実際のコード例を使ってその手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使用して、配列内にネストされたドキュメントを持つコレクションを作成します。
> db.demo465.insertOne(
... {
... id: 101,
... details: [{
... Name: "Chris",
... Info: {
... Subject: "MongoDB",
... Marks: 67
... }
... }, {
... Name: "David",
... Info: {
... Subject: "MySQL",
... Marks: 78
... }
... }]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e80421bb0f3fa88e2279061")
}続いて、2つ目のドキュメントを挿入します。
> db.demo465.insertOne(
... {
... id: 102,
... details: [{
... Name: "Bob",
... Info: {
... Subject: "Java",
... Marks: 45
... }
... }, {
... Name: "Carol",
... Info: {
... Subject: "C",
... Marks: 67
... }
... }]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e80421cb0f3fa88e2279062")
}2. コレクション内の全ドキュメントを表示する
find()メソッドを引数なしで実行すると、コレクション内のすべてのドキュメントを確認できます。
> db.demo465.find();
上記クエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e80421bb0f3fa88e2279061"), "id" : 101, "details" : [ { "Name" : "Chris",
"Info" : { "Subject" : "MongoDB", "Marks" : 67 } }, { "Name" : "David", "Info" : { "Subject" :
"MySQL", "Marks" : 78 } } ] }
{ "_id" : ObjectId("5e80421cb0f3fa88e2279062"), "id" : 102, "details" : [ { "Name" : "Bob",
"Info" : { "Subject" : "Java", "Marks" : 45 } }, { "Name" : "Carol", "Info" : { "Subject" : "C",
"Marks" : 67 } } ] }3. ドット記法でネストされたドキュメントを検索する
配列内のフィールドを指定して検索するには、「配列フィールド名.内部フィールド名」という形式のドット記法を使用します。たとえば、details配列内のNameが「Bob」であるドキュメントを取得するには、次のようにクエリを書きます。
> db.demo465.find({"details.Name":"Bob"});このクエリを実行すると、以下の出力が得られます。
{ "_id" : ObjectId("5e80421cb0f3fa88e2279062"), "id" : 102, "details" : [ { "Name" : "Bob",
"Info" : { "Subject" : "Java", "Marks" : 45 } }, { "Name" : "Carol", "Info" : { "Subject" : "C",
"Marks" : 67 } } ] }ポイントまとめ
- ドット記法「
details.Name」は、配列内のどの要素に一致する値があってもヒットします。 - さらに深い階層も「
details.Info.Subject」のように連結することで検索可能です。 - 特定の配列位置だけを対象にしたい場合は、「
details.0.Name」のようにインデックスを指定します。
このように、MongoDBではドット記法を使うだけで、配列内のネストされたドキュメントに対する柔軟な検索が実現できます。データ構造が複雑になっても、条件に合致するドキュメントを効率的に取り出せるため、実務でも非常に役立つテクニックです。
-
MongoDBですべてのサブドキュメントからオブジェクトの一意なペアを取得する方法
MongoDBで重複を排除した一意な(distinct)オブジェクトのペアを取得するには、集計パイプラインの $group 演算子を使用します。この記事では、実際のコード例を使って、すべてのサブドキュメントから名前ごとにスコアをグループ化し、合計値を求める方法を解説します。サンプルコレクションの作成まず、insertOne() メソッドを使ってドキュメントを含むコレクションを作成します。> db.demo522.insertOne({Name:John,Score:45});{ acknowledged : true, insertedId : ObjectId(5e89b6
-
MongoDBで配列フィールドに対して$allを使って全要素に一致させる方法
配列フィールドの全要素に一致させるには MongoDBで配列内のすべての指定要素を含むドキュメントを検索したい場合には、$all 演算子を使用します。$all は、対象フィールドの値が配列であり、その配列が指定した要素をすべて含んでいるドキュメントだけを選択するクエリ演算子です。 ここでは、サンプルコレクションを作成し、実際に $all を使った検索手順を順番に見ていきましょう。 1. コレクションへのドキュメント登録 まずは insertOne() メソッドを使って、サンプルコレクション「demo695」にドキュメントを挿入します。 > db.demo695.insertOne({L