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

MongoDBでグループ化をオブジェクトに投影し、点数フィールドのみを表示する方法

MongoDBでは、配列形式のドキュメントデータをJavaScriptのオブジェクト形式へ変換(投影)できます。本記事では、科目名と点数を含むドキュメントをグループ化し、科目名をキー・点数のみを値とするオブジェクトを作成する手順を解説します。

サンプルドキュメントの作成

まず、科目名(SubjectName)と点数(Marks)を含むドキュメントを配列として作成します。

> var document = [
...    { "SubjectName" : "MySQL", "Marks" : 78 },
...    { "SubjectName" : "MongoDB", "Marks" : 89 },
...    { "SubjectName" : "Java", "Marks" : 71 },
... ];

作成したドキュメントの確認

以下のクエリを実行して、作成したドキュメントを表示します。

> printjson(document);

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

[
   {
      "SubjectName" : "MySQL",
      "Marks" : 78
   },
   {
      "SubjectName" : "MongoDB",
      "Marks" : 89
   },
   {
      "SubjectName" : "Java",
      "Marks" : 71
   }
]

グループ化をオブジェクトに投影するクエリ

続いて、forEach()メソッドで各ドキュメントを走査し、SubjectNameをキー、Marksを値として新しい空のオブジェクトに格納します。

> var makeObject = {};
> document.forEach(function (d){
...    makeObject[d.SubjectName] = d.Marks;
... });
> printjson(makeObject);

実行すると、科目名がキーとなり、点数のみが値として格納されたオブジェクトが出力されます。

{ "MySQL" : 78, "MongoDB" : 89, "Java" : 71 }

処理のポイント

  • var makeObject = {}; … 値を格納するための空のオブジェクトを用意します。
  • forEach() … 配列内の各ドキュメントに対して、順番に関数を実行します。
  • makeObject[d.SubjectName] = d.Marks; … 科目名をプロパティ名(キー)とし、その値として点数のみを設定します。これにより、SubjectNameはキーへ変換され、Marksフィールドだけが値として残ります。

この手法を活用すれば、配列形式のデータを扱いやすいオブジェクト形式へ簡単に変換でき、必要なフィールド(ここでは点数)だけを抽出して表示できます。集計結果の整形やAPIレスポンスの作成など、さまざまな場面で役立つテクニックです。

  1. MongoDBの$projectで配列内の特定フィールドだけを表示し、他のフィールドを除外する方法

    MongoDBの集計パイプライン(Aggregation Pipeline)では、$projectと$unwindを組み合わせることで、配列内の特定のフィールドだけを表示できます。逆に、不要なフィールドを除外したい場合は、そのフィールドの値を0に設定します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。> db.demo731.insertOne({ ProductInformation: [ { ProductId:Product-1, ProductPrice:80 }, { ProductId:Product-2, ProductPrice:45

  2. 【MongoDB】ネストされたドキュメントのキー名のみを抽出して表示する方法

    MongoDBでは、配列内にネストされたドキュメント(サブドキュメント)のキー名だけを一覧として取得したいケースがあります。本記事では、insertOne()でサンプルデータを作成し、find()で内容を確認した後、集計パイプラインの$reduce、$objectToArray、$map、$concatArraysを組み合わせて、ネストされたドキュメントのキー名のみを抽出する方法を実行例付きで解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、detailsフィールドに複数のドキュメントを持つ配列を含むコレクションを作成します。 > db.dem