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

MongoDBの集計フレームワークで、全テストの平均点より低いテスト1のスコアを持つ学生の名前を取得する方法


MongoDBでは、aggregate()メソッドを使用することで、全テストの平均点よりもテスト1(Value1)のスコアが低い学生の名前を簡単に抽出できます。ここでは、各テストの点数を「Value1」「Value2」「Value3」というフィールドとして管理しているものとします。

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

まずは、学生ごとのテスト結果を含むドキュメントを挿入して、コレクションを作成しましょう。

db.demo432.insertOne({
   "_id" : 101,
   "Name" : "David",
   "Value1" : 67,
   "Value2" : 87,
   "Value3" : 78
})
{ "acknowledged" : true, "insertedId" : 101 }

db.demo432.insertOne({
   "_id" : 102,
   "Name" : "Sam",
   "Value1" : 98,
   "Value2" : 45,
   "Value3" : 90
})
{ "acknowledged" : true, "insertedId" : 102 }

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

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

> db.demo432.find();

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

{ "_id" : 101, "Name" : "David", "Value1" : 67, "Value2" : 87, "Value3" : 78 }
{ "_id" : 102, "Name" : "Sam", "Value1" : 98, "Value2" : 45, "Value3" : 90 }

3. テスト1のスコアが全体平均より低い学生名を取得するクエリ

以下が、テスト1(Value1)のスコアが全テストの平均点を下回る学生の名前を取得するための集計クエリです。

db.demo432.aggregate([
   {
      $project: {
         Name: '$Name',
         Value1: '$Value1',
         average: {
            $avg: ['$Value1', '$Value2', '$Value3']
         }
      }
   },
   {
      $group: {
         _id: null,
         NameValue1: {
            $push: {
               "Name": "$Name",
               "Value1": "$Value1"
            }
         },
         totalAverage: {
            $avg: '$average'
         }
      }
   },
   {
      $project: {
         lessthanAverageNames: {
            $map: {
               input: {
                  $filter: {
                     input: "$NameValue1",
                     as: "out",
                     cond: {
                        $lt: ["$$out.Value1", "$totalAverage"]
                     }
                  }
               },
               as: "o",
               in: "$$o.Name"
            }
         }
      }
   }
]);

このクエリを実行すると、次の結果が出力されます。

{ "_id" : null, "lessthanAverageNames" : [ "David" ] }

4. クエリの仕組み

この集計パイプラインは、大きく分けて3つのステージで構成されています。

  • $projectステージ:各ドキュメントごとに、$avg演算子を使ってValue1〜Value3の平均値を計算します。
  • $groupステージ:_idにnullを指定してすべてのドキュメントを1つのグループにまとめ、学生名とValue1のペアを配列(NameValue1)に格納すると同時に、各学生の平均値から全体の総平均(totalAverage)を算出します。
  • $mapと$filter:NameValue1の中から、Value1がtotalAverageより小さい学生だけを絞り込み、該当する学生の名前だけを配列として返します。

今回のサンプルデータでは、全テストを通じた総平均は約77.5点になります。DavidのValue1は67点でこれを下回る一方、SamのValue1は98点と上回っているため、最終的な結果には「David」だけが含まれるというわけです。

  1. たった29ドルでMicrosoft OfficeをAからZまでマスター!全8コース収録のお得なバンドル

    オフィスで日々使っているソフトウェアを、もっと最大限に活用したいとお考えではありませんか?そんな方にぜひおすすめしたいのが「A to Z Microsoft Officeバンドル」です。Excel、Outlook、Access、PowerPoint、Wordなど、ビジネスシーンで欠かせないツールの使い方を、基礎から応用まで体系的に学ぶことができます。 このバンドルには、以下の8つのコースが含まれています。 Power BI Essentials かつてビジネスインテリジェンス(BI)ツールは高価で専門性が高く、ITスペシャリストだけが扱えるものでした。しかし本コースでは、Power BIユー

  2. Arrange・Act・Assertの三相パターンで、より良いテストを書こう

    (これは『Practicing Rails』からの短い抜粋です。こちらから登録すると、第1章を無料で入手できます!) 新しいアプリを開発していて、Railsが自動的にテストファイルを生成してくれたとしましょう。 test/models/bug_test.rbrequire test_helper class BugTest < ActiveSupport::TestCase # test the truth do # assert true # end end コメントアウトを外して、テスト名を決めれば、あとはテストコードを書くだけ。でも、いったい何から書けばい