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

MongoDBですべての値を抽出して1行の配列として表示する方法

MongoDBの集計フレームワーク(Aggregation Pipeline)を活用すると、ドキュメント内のネストされた配列から値をすべて取り出し、1行の配列としてまとめることができます。本記事では、$unwind$project$groupなどのステージを組み合わせて、複数の配列に分散している「Name」フィールドの値をすべて抽出し、単一の配列として出力する方法を実例付きで解説します。

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

まず、insertOne()メソッドを使用して、detailsフィールドの中にさらにNameという配列を持つドキュメントを含むコレクションを作成しましょう。

> db.demo389.insertOne(
...     {
...       "details":[
...          {
...            "Name":[
...               "Chris",
...               "David"
...            ]
...          },
...          {
...            "Name":[
...               "Bob",
...               "Mike"
...            ]
...          },
...          {
...            "Name":[
...               "Carol",
...               "Sam"
...            ]
...          },
...          {
...            "Name":[
...               "David",
...               "John"
...            ]
...          }
...       ]
...    }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e5d1d8f22064be7ab44e7f9")
}

登録済みドキュメントの確認

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

> db.demo389.find();

実行すると、次のような出力が得られます。

{
    "_id" : ObjectId("5e5d1d8f22064be7ab44e7f9"), "details" : [
       { "Name" : [ "Chris", "David" ] }, { "Name" : [ "Bob", "Mike" ] },
       { "Name" : [ "Carol", "Sam" ] }, { "Name" : [ "David", "John" ] }
    ] 
}

すべての値を抽出するクエリ

ここからが本題です。以下のクエリでは、aggregate()メソッドを使い、複数段階のパイプライン処理によってネストされた配列内のすべてのName値を抽出しています。

> db.demo389.aggregate([
...    {
...       $unwind: "$details"
...    },
...    {
...       $unwind: "$details.Name"
...    },
...    {
...       $project: {
...          "_id": "$_id",
...          "Name": "$details.Name"
...       }
...    },
...    {
...       $group: {
...          _id: "_id",
...          out: {
...             $push: "$Name"
...          }
...       }
...    },
...    {
...       $project: {
...          "_id": 0,
...          "NameArray": "$out"
...       }
...    }
... ])

各ステージの処理内容

  • $unwind: "$details" … details配列を要素ごとに分解し、個別のドキュメントへ展開します。
  • $unwind: "$details.Name" … さらにName配列も分解して、名前1件ずつのドキュメントにします。
  • $project … 出力に必要なフィールド(_idとName)だけに絞り込みます。
  • $group … _idをキーにグループ化し、$push演算子ですべてのName値を1つの配列「out」へ集約します。
  • $project … 最終出力から_idを除外し、「NameArray」という名前で結果を整形します。

実行結果

クエリを実行すると、散らばっていたすべての値が1つの配列にまとまって出力されます。

{ "NameArray" : [ "Chris", "David", "Bob", "Mike", "Carol", "Sam", "David", "John" ] }

このように、$unwindで配列を展開し、$groupの$pushで再集約する流れを組むことで、ネストされた構造を持つデータからでも目的の値だけを簡単に1行で取得できます。同様の手法は、タグやカテゴリなど配列形式で保存されたデータの一覧化にも応用できます。

  1. MySQLで列の値と任意のテキストを連結して1つの列に表示する方法

    MySQLで列の値とテキストを連結する方法MySQLでは、CONCAT()関数を使用することで、テーブルの列の値と任意のテキストを連結し、結果を1つの列として表示できます。本記事では、サンプルテーブルを作成し、実際に文字列を連結して表示するまでの手順を具体例とともに解説します。1. テーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> );Query OK, 0 rows affected (0.93 sec)こ

  2. MySQLですべての行の値をカンマ区切りの単一の行として表示する方法

    GROUP_CONCAT()とCONCAT()を使って複数行の値を1行にまとめる方法MySQLでテーブル内の複数の行に格納された値を、カンマ(コンマ)で区切られた単一の行として取得したい場合には、GROUP_CONCAT()関数とCONCAT()関数を組み合わせて使用します。GROUP_CONCAT()はグループ内の複数の値を連結して文字列として返し、CONCAT()を使うことで各値の前後に任意の文字を追加できます。以下では、実際の手順をサンプルコードとともに順番に解説していきます。1. サンプルテーブルを作成するまず、テスト用のテーブルを作成します。ここではint型の「Id」カラムを持つシン