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

MongoDBでドキュメント内のサブ配列から最大値を取得する方法

MongoDBでドキュメント内のサブ配列から最大値を取得する方法

ドキュメント内のサブ配列(ネストされた配列)から最高の値を取得するには、アグリゲーションフレームワーク(集計フレームワーク)を使用するのが効果的です。この記事では、学生ごとの数学のスコアが格納された配列から、最も高いスコアを取得する手順を具体例とともに解説します。

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

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

> db.findHighestValueDemo.insertOne(
   ... {
      ... _id: 10001,
      ... "StudentDetails": [
         ... { "StudentName": "Chris", "StudentMathScore": 56},
         ... { "StudentName": "Robert", "StudentMathScore":47 },
         ... { "StudentName": "John", "StudentMathScore": 98 }]
   ... }
... );
{ "acknowledged" : true, "insertedId" : 10001 }
> db.findHighestValueDemo.insertOne(
   ... {
      ... _id: 10002,
      ... "StudentDetails": [
         ... { "StudentName": "Ramit", "StudentMathScore": 89},
         ... { "StudentName": "David", "StudentMathScore":76 },
         ... { "StudentName": "Bob", "StudentMathScore": 97 }
      ... ]
   ... }
... );
{ "acknowledged" : true, "insertedId" : 10002 }

2. 登録したドキュメントの確認

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

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

上記のクエリを実行すると、次のような出力が得られます。

{
   "_id" : 10001,
   "StudentDetails" : [
      {
         "StudentName" : "Chris",
         "StudentMathScore" : 56
      },
      {
         "StudentName" : "Robert",
         "StudentMathScore" : 47
      },
      {
         "StudentName" : "John",
         "StudentMathScore" : 98
      }
   ]
}
{
   "_id" : 10002,
   "StudentDetails" : [
      {
         "StudentName" : "Ramit",
         "StudentMathScore" : 89
      },
      {
         "StudentName" : "David",
         "StudentMathScore" : 76
      },
      {
         "StudentName" : "Bob",
         "StudentMathScore" : 97
      }
   ]
}

3. サブ配列から最高値を取得するクエリ

それでは、aggregate()メソッドを使って、すべてのドキュメントのサブ配列の中から最も高い値を持つ要素を取得してみましょう。

> db.findHighestValueDemo.aggregate([
   ... {$project:{"StudentDetails.StudentName":1, "StudentDetails.StudentMathScore":1}},
   ... {$unwind:"$StudentDetails"},
   ... {$sort:{"StudentDetails.StudentMathScore":-1}},
   ... {$limit:1}
... ]).pretty();

4. アグリゲーションパイプラインの解説

  • $project:出力に必要な「StudentName」と「StudentMathScore」フィールドのみを指定します。不要なデータを除外することで効率が向上します。
  • $unwind:StudentDetails配列を要素ごとの個別ドキュメントに展開します。これにより各学生のスコアを独立したレコードとして扱えるようになります。
  • $sort:StudentMathScoreを降順(-1)で並べ替えます。最もスコアの高いドキュメントが先頭に来ます。
  • $limit:先頭の1件のみを取得します。つまり、全体で最高のスコアを持つ要素が結果として返されます。

5. 実行結果

上記のパイプラインを実行すると、次の出力が得られます。

{
   "_id" : 10001,
   "StudentDetails" : {
      "StudentName" : "John",
      "StudentMathScore" : 98
   }
}

この結果から、すべてのドキュメントを通じて最も高い数学のスコアはJohnの98点であることが確認できます。このように$project、$unwind、$sort、$limitを組み合わせることで、ネストされた配列の中から簡単に最大値を取得できます。

  1. MongoDBで特定の値以上のドキュメントを検索する方法($gte演算子の使い方)

    MongoDBで特定の値「以上」の値を持つドキュメントを検索したい場合、比較演算子 $gte(greater than or equal)を使用します。$gte は指定した値と等しいか、それより大きい値に一致するドキュメントを抽出できる便利な演算子です。$gteを使った基本構文db.yourCollectionName.find({yourFieldName:{$gte:yourValue}});コレクション名、フィールド名、基準となる値をそれぞれ置き換えて使用します。なお、「より大きい」値のみを取得したい場合は $gt を使いますが、ここでは「以上」を意味する $gte を採用しています。サ

  2. MySQLで値を降順・昇順に並べ替える方法|ORDER BYの基本

    MySQLでカラムの値を高い順(降順)に並べ替えたい場合は、ORDER BY DESCを使用します。select *from yourTableName order by yourColumnName DESC;逆に、低い順(昇順)で並べ替えたい場合は、ORDER BY ASCを使用します。select *from yourTableName order by yourColumnName ASC;サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable ( Value int ); Query OK, 0 ro