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

MongoDBでサブドキュメントをクエリして1行に表示する方法

MongoDBのサブドキュメントを1行ずつ出力するには

MongoDBで配列形式のサブドキュメント(ネストされたドキュメント)を1行ずつ表示したい場合は、aggregate()メソッドと$unwind演算子を組み合わせて使用します。$unwindは、配列内の各要素を個別のドキュメントとして展開するため、サブドキュメントごとに処理を行うことができます。

ここでは、実際のコード例を使って手順を詳しく解説します。

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

まず、insertOne()メソッドを使ってドキュメントを挿入し、サンプル用のコレクションを作成します。

> db.demo183.insertOne(
... {
...   "_id": "110",
...   "DueDate": ISODate("2020-02-04T01:10:42.000Z"),
...   "ProductDetails": [
...       {
...          "ProductName": "Product-1",
...          "isAvailable": true
...       },
...       {
...          "ProductName": "Product-2",
...          "isAvailable": false
...       }
...    ]
...   }
...);
{ "acknowledged" : true, "insertedId" : "110" }

2. 挿入したドキュメントの確認

find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。

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

上記のコマンドを実行すると、次のような出力が得られます。

{
    "_id" : "110",
    "DueDate" : ISODate("2020-02-04T01:10:42Z"),
    "ProductDetails" : [
       {
          "ProductName" : "Product-1",
          "isAvailable" : true
       },
       {
          "ProductName" : "Product-2",
          "isAvailable" : false
       }
    ]
}

このように、「ProductDetails」フィールドには複数のサブドキュメントが配列として格納されています。

3. $unwindとaggregate()でサブドキュメントを1行に表示する

それでは本題です。aggregate()パイプライン内で$matchと$unwindを使用し、forEach()で各サブドキュメントを1行ずつ出力します。

> var productdata = function (d) {
...   print(d.DueDate+", " + d.ProductDetails.ProductName + ", " + d.ProductDetails.isAvailable);
... }
> var iterator = db.demo183.aggregate([
...   {$match: {_id: "110"}},
...   {$unwind: '$ProductDetails'}
... ]);
> iterator.forEach(productdata );

実行結果

上記のクエリを実行すると、各サブドキュメントが以下のように1行ずつ整形されて表示されます。

Tue Feb 04 2020 06:40:42 GMT+0530 (India Standard Time), Product-1, true
Tue Feb 04 2020 06:40:42 GMT+0530 (India Standard Time), Product-2, false

処理のポイント

  • $match: 対象となるドキュメント(ここでは_idが「110」)だけを絞り込みます。
  • $unwind: 「ProductDetails」配列を展開し、各要素を独立したドキュメントとして扱えるようにします。
  • forEach(): 展開された各ドキュメントに対してカスタム関数を実行し、日付・商品名・在庫状況を1行にまとめて出力します。

この手法を使えば、配列内のネストされたデータを見やすい形式で抽出・表示できます。レポート作成やデバッグ時のデータ確認など、さまざまな場面で活用できるので、ぜひ覚えておきましょう。

  1. MongoDBで配列の要素を1つだけ取得する方法|$slice演算子の使い方

    MongoDBの$sliceで配列の要素を1つだけ取得する配列から特定の件数の要素だけを取り出したい場合、MongoDBでは$slice演算子を使用します。$sliceはプロジェクション演算子の一種で、指定した件数分の配列要素のみを返すことができます。ここでは、実際にコレクションを作成し、$sliceを使って配列の先頭1件だけを取得する手順を順番に見ていきましょう。サンプルデータの作成まず、insertOne()メソッドを使ってドキュメントをコレクションに挿入します。> db.demo579.insertOne( ... { ... _id : 101, ...

  2. MongoDBで1つのクエリを使って複数のドキュメントを一括更新する方法(bulkWrite活用ガイド)

    MongoDBで1つのクエリで複数のドキュメントを更新するには?MongoDBで1回のリクエスト(1つのクエリ)で複数のドキュメントを効率的に更新したい場合は、bulkWrite()メソッドを使用します。bulkWrite()は、複数の書き込み操作(insert、update、deleteなど)をまとめてサーバーに送信できるため、個別にクエリを発行するよりもパフォーマンス面で優れています。ここでは、updateOne操作を組み合わせて、複数のドキュメントのフィールドを一度に更新する手順を具体的に解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使って