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

MongoDBで埋め込みドキュメントの配列を親に移動し、集計パイプラインでキー/値を変更する方法

埋め込みドキュメント配列を親レベルに移動するには

MongoDBの集計パイプライン(Aggregation Pipeline)では、$replaceRootを使用します。$replaceRootは、入力ドキュメントを指定された新しいドキュメントに置き換えるステージです。この操作を実行すると、_idフィールドを含む入力ドキュメント内のすべての既存フィールドが置き換えられます。

以下の手順に沿って、埋め込みドキュメントの配列を親レベルへ移動しながら、キーと値の構造を変換する方法を見ていきましょう。

1. コレクションを作成してドキュメントを挿入する

まずはinsertOne()メソッドを使って、ドキュメントを含むコレクションを作成します。

> db.demo733.insertOne(
...    {
...       "SubjectDetails":
...       [
...          {
...             SubjectName:"MongoDB",
...             "Marks":85
...          },
...          {
...             SubjectName:"MySQL",
...             "Marks":90
...          },
...          {
...             SubjectName:"PL/SQL",
...             "Marks":98
...          }
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5eac6e6156e85a39df5f6342")
}

2. find()メソッドですべてのドキュメントを表示する

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

> db.demo733.find();

この出力は次のようになります。

{ "_id" : ObjectId("5eac6e6156e85a39df5f6342"), "SubjectDetails" : [ { "SubjectName" : "MongoDB", "Marks" : 85 }, { "SubjectName" : "MySQL", "Marks" : 90 }, { "SubjectName" : "PL/SQL", "Marks" : 98 } ] }

現時点では、科目名と点数がSubjectDetailsという配列の中に埋め込まれた形で格納されています。

3. 集計パイプラインで配列を親に移動しキー/値を変換する

次のクエリでは、$replaceRoot$mergeObjects、さらに$arrayToObject$mapを組み合わせることで、埋め込みドキュメントの配列を親レベルに移動し、各科目名をキー、点数を値として変換しています。

> db.demo733.aggregate([
...    {
...       $replaceRoot: {
...          newRoot: {
...             $mergeObjects: [
...                { _id: "$_id" },
...                { $arrayToObject: { $map: { input: "$SubjectDetails", in: [ "$$this.SubjectName", "$$this.Marks" ] } } }
...             ]
...          }
...       }
...    }
... ]).pretty()

実行結果

{
   "_id" : ObjectId("5eac6e6156e85a39df5f6342"),
   "MongoDB" : 85,
   "MySQL" : 90,
   "PL/SQL" : 98
}

ご覧のとおり、SubjectDetails配列内の各要素が展開され、SubjectNameがオブジェクトのキーに、Marksがその値に変換されたことが確認できます。また、$mergeObjectsの最初の引数として{ _id: "$_id" }を指定しているため、元のドキュメントの_idも保持されています。

  1. Bashの配列変数とは?宣言・追加・削除・参照の方法を実例付きで解説

    以前、Bashにおける変数の基本的な使い方について解説しました。本記事ではその発展編として、Bashの配列(array)変数について詳しく説明し、実際に使えるサンプルコードも交えて紹介します。 配列とは何か 配列とは、複数の値をひとつの変数で保持できる変数の型です。値のリストとして扱うことができ、ループ処理で各要素を順番に取り出しながら、個別に操作を行えます。 例えば、複数のファイルに対して同じ処理を実行したい場合を考えてみましょう。ファイル名のリストを配列として保存しておけば、ループで各ファイル名を取り出し、それぞれに同じ操作を適用できます。 配列の各要素にはインデックス(添字)が割り当てら

  2. ネットワークセキュリティキーの確認・変更方法を徹底解説【Windows対応】

    Wi-Fiのパスワードは、専門用語では「ネットワークセキュリティキー」と呼ばれます。ネットワーク接続を確立する際に入力する文字列のことで、不正なアクセスからWi-Fiネットワークを守る重要な役割を担っています。同じネットワークに接続されたデバイス同士は相互に通信できるため、見知らぬデバイスや悪意のあるデバイスが侵入すると、ファイルやオンライン上の活動が盗み見られる危険性があります。つまり、セキュリティキーはネットワークの安全性を直接左右するのです。例えば、古い暗号化方式のWEPを使用している場合、ネットワークはハッカーによる攻撃や盗聴にさらされやすくなります。 ネットワークセキュリティキーの主