MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBで埋め込みドキュメント(サブドキュメント)のフィールドをクエリする方法

はじめに

MongoDBでは、ドキュメントの中に配列やオブジェクトとして埋め込まれたデータ(埋め込みドキュメント)を保存できます。本記事では、埋め込みドキュメント内のフィールドに対してクエリを実行し、条件に一致するドキュメントを取得する方法を解説します。

サンプルコレクションの作成

まず、insertOne()メソッドを使って、埋め込みドキュメントを含むコレクションを作成しましょう。

> db.embeddedDocumentDemo.insertOne(
...    {
...       "CustomerDetails":[
...          {"CustomerName":"Chris", "CustomerPurchasePrice":3000},
...          {"CustomerName":"Robert", "CustomerPurchasePrice":4500},
...          {"CustomerName":"David", "CustomerPurchasePrice":1000}
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd32347edc6604c74817ccd")
}

この例では、CustomerDetailsという配列の中に、顧客名と購入金額を持つ複数の埋め込みドキュメントを格納しています。

登録したドキュメントの確認

find()メソッドにpretty()を組み合わせると、コレクション内のすべてのドキュメントを見やすい形式で表示できます。

> db.embeddedDocumentDemo.find().pretty();

実行結果は以下のとおりです。

{
   "_id" : ObjectId("5cd32347edc6604c74817ccd"),
   "CustomerDetails" : [
      {
         "CustomerName" : "Chris",
         "CustomerPurchasePrice" : 3000
      },
      {
         "CustomerName" : "Robert",
         "CustomerPurchasePrice" : 4500
      },
      {
         "CustomerName" : "David",
         "CustomerPurchasePrice" : 1000
      }
   ]
}

埋め込みドキュメントのフィールドに対するクエリ

埋め込みドキュメント内の特定のフィールドを検索するには、ドット記法(dot notation)を使用します。「親フィールド.子フィールド」の形式でパスを指定するのがポイントです。

ここでは、CustomerPurchasePrice4500であるドキュメントを検索してみます。

> db.embeddedDocumentDemo.find({"CustomerDetails.CustomerPurchasePrice":4500});

実行結果は以下のとおりです。

{ 
   "_id" : ObjectId("5cd32347edc6604c74817ccd"), 
   "CustomerDetails" : [ 
      { "CustomerName" : "Chris", "CustomerPurchasePrice" : 3000 }, 
      { "CustomerName" : "Robert", "CustomerPurchasePrice" : 4500 }, 
      { "CustomerName" : "David", "CustomerPurchasePrice" : 1000 } 
   ] 
}

結果のポイント

出力を見ると、一致したのは「Robert」の購入金額(4500)ですが、返却されるドキュメントには親ドキュメント全体(すべてのCustomerDetails配列要素を含む)が表示されています。これはMongoDBの仕様であり、クエリ条件はあくまで「ドキュメント単位」で判定されるためです。

まとめ

  • 埋め込みドキュメントのフィールドを検索するには、ドット記法(例:"CustomerDetails.CustomerPurchasePrice")を使用します。
  • 配列内の埋め込みドキュメントに対しても、同様の構文で条件を指定できます。
  • 条件に一致した場合、返却されるのは該当する部分ではなく、ドキュメント全体である点に注意しましょう。
  1. MongoDBでネストされたドキュメントを更新する方法|位置演算子$を使った配列要素の更新手順

    MongoDBでは、ドキュメント内の配列に格納されたネストされた(入れ子の)ドキュメントも、位置演算子「$」を使うことで効率的に更新できます。この記事では、実際のコード例を通じて、配列内の特定のサブドキュメントを更新する手順をわかりやすく解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ネストされたドキュメントを含むコレクションを作成します。ここでは「Information」というフィールドに、複数のサブドキュメントを持つ配列を格納しています。 > db.demo595.insertOne( { Information: [ { _i

  2. MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法

    MongoDBでネストされた配列をフィルタリングする基本アプローチMongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。> db.demo736.insertOne( ... { ... _id: