MongoDBでグループごとの最大値を取得する方法($sortと$groupの活用)
MongoDBで、重複している個別の要素(グループ)ごとに最大値を取得したい場合、aggregate()メソッドと$sort・$groupステージを組み合わせることで実現できます。この記事では、実際のコード例を通じて、その手順をわかりやすく解説します。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。ここではdemo750というコレクションに、idとvalueフィールドを持つドキュメントを挿入します。
> db.demo750.insertOne({id:101,value:50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae74b2a930c785c834e566")
}
> db.demo750.insertOne({id:102,value:40});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae74c8a930c785c834e567")
}
> db.demo750.insertOne({id:101,value:110});
{
"acknowledged" : true,
"insertedId" : ObjectId("5eae74dba930c785c834e568")
}このコレクションには、id: 101のドキュメントが2件(valueが50と110)存在している点に注目してください。この中から、idごとの最大のvalueを取り出すのが今回の目的です。
登録したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo750.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5eae74b2a930c785c834e566"), "id" : 101, "value" : 50 }
{ "_id" : ObjectId("5eae74c8a930c785c834e567"), "id" : 102, "value" : 40 }
{ "_id" : ObjectId("5eae74dba930c785c834e568"), "id" : 101, "value" : 110 }個別要素ごとの最大値を取得するクエリ
それでは、MongoDBで各idごとの最大値を取得するためのクエリを見ていきましょう。ポイントは以下の3つのステージです。
- $sort:valueを降順(-1)にソートし、最大値が先頭に来るようにします。
- $group:idフィールドでグループ化し、
$firstを使ってソート後の先頭(=最大値)を取得します。 - $project:出力するフィールドを整形し、見やすい結果にします。
> db.demo750.aggregate([
... {
... $sort: { value: -1 }
... },
... {
... $group: {
... _id: "$id",
... value: { $first: "$value" }
... }
... },
... {
... $project: {
... id: "$_id",
... value: 1
... }
... }
... ])実行結果
上記のクエリを実行すると、次のような出力が得られます。
{ "_id" : 102, "value" : 40, "id" : 102 }
{ "_id" : 101, "value" : 110, "id" : 101 }結果を見ると、id: 101のグループからは最大値である110が、id: 102のグループからは40が取得できていることがわかります。
まとめ
MongoDBでグループごとの最大値を取得するには、$sortで降順に並べ替え、$groupと$firstで先頭の値を取得するのが定番のテクニックです。この方法は、売上データのカテゴリ別最高額や、ユーザーごとの最新スコアなど、さまざまな場面で応用できます。ぜひ実際のプロジェクトでも活用してみてください。
-
MongoDBですべてのドキュメントにわたる個別(ユニーク)な値をカウントする方法
MongoDBでコレクション内のすべてのドキュメントにわたって、重複を除いた個別(ユニーク)な値の数をカウントしたい場合は、aggregate()メソッドを使用します。この記事では、実際のコード例とともに、その手順をわかりやすく解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使って、デモ用のコレクション「demo718」にドキュメントを挿入します。 > db.demo718.insertOne( ... { ... id:101, ... details: ... { ... Oth
-
MySQLで2つの値の最大値を取得する方法|GREATEST関数の使い方を解説
MySQLで2つの値を比較し、大きい方(最大値)を取得したい場合は、あらかじめ用意されている組み込み関数「GREATEST()」を使用します。この関数は、引数として渡された複数の値の中から最大の値を返してくれます。GREATEST()関数の基本構文GREATEST()関数の構文は以下のとおりです。SELECT greatest(value1, value2);このクエリを実行すると、value1とvalue2のうち大きい方の値が結果として返されます。それでは、具体的な使用例をいくつか見ていきましょう。ケース1:数値(INT型)同士を比較する場合まず、両方の引数に整数値を指定した場合の例です。m