MongoDBで最大値と最小値を取得する方法【$max・$min演算子の使い方】
MongoDBでコレクション内の最大値・最小値を取得したい場合は、アグリゲーションフレームワーク(aggregate)と $max・$min 演算子を組み合わせるのが基本です。この記事では、実際にコレクションを作成しながら、最大値と最小値を取得する手順をわかりやすく解説します。
1. サンプルコレクションの作成
まずは動作確認用として、数値フィールドを持つドキュメントをいくつか挿入したコレクション(maxAndMinDemo)を作成します。
> db.maxAndMinDemo.insertOne({"Value":98});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd698a357806ebf1256f129")
}
> db.maxAndMinDemo.insertOne({"Value":97});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd698af57806ebf1256f12a")
}
> db.maxAndMinDemo.insertOne({"Value":69});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd698b357806ebf1256f12b")
}
> db.maxAndMinDemo.insertOne({"Value":96});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd698b657806ebf1256f12c")
}
> db.maxAndMinDemo.insertOne({"Value":99});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd698b957806ebf1256f12d")
}
2. 登録したドキュメントの確認
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.maxAndMinDemo.find().pretty();
実行すると、以下のように5件のドキュメントが表示されます。
{ "_id" : ObjectId("5cd698a357806ebf1256f129"), "Value" : 98 }
{ "_id" : ObjectId("5cd698af57806ebf1256f12a"), "Value" : 97 }
{ "_id" : ObjectId("5cd698b357806ebf1256f12b"), "Value" : 69 }
{ "_id" : ObjectId("5cd698b657806ebf1256f12c"), "Value" : 96 }
{ "_id" : ObjectId("5cd698b957806ebf1256f12d"), "Value" : 99 }
3. $max と $min で最大値・最小値を取得する
最大値と最小値を一度に取得するには、aggregate() の中で $group ステージを使用し、_id を null に設定します。こうすることでコレクション全体がひとつのグループとして扱われ、すべてのドキュメントを対象に集計できます。
> db.maxAndMinDemo.aggregate([
{ "$group": {
"_id": null,
"MaximumValue": { "$max": "$Value" },
"MinimumValue": { "$min": "$Value" }
}}
]);
実行結果は次のとおりです。
{ "_id" : null, "MaximumValue" : 99, "MinimumValue" : 69 }
「Value」フィールドの最大値が 99、最小値が 69 として正しく取得できていることがわかります。
補足:sort() を使った代替方法
アグリゲーションを使わず、sort() と limit(1) を組み合わせる方法もあります。降順ソートの先頭1件が最大値、昇順ソートの先頭1件が最小値に対応します。
// 最大値を取得
> db.maxAndMinDemo.find().sort({ "Value": -1 }).limit(1);
// 最小値を取得
> db.maxAndMinDemo.find().sort({ "Value": 1 }).limit(1);
ただし、大量のドキュメントを扱う場合や、平均値など他の統計値と同時に取得したいケースでは、aggregate フレームワークを使う方が柔軟で効率的です。用途に応じて使い分けるとよいでしょう。
-
【Java】リスト内の最大要素と最小要素の位置(インデックス)を見つける方法
リストや配列を扱う際、「最大値・最小値そのもの」だけでなく、それらがどの位置(インデックス)に存在するかを知りたいケースはよくあります。本記事では、Javaの Collections.max() / Collections.min() と線形探索(リニアサーチ)を組み合わせて、最大・最小要素の位置を特定するプログラムを解説します。 サンプルコード import java.util.*; import java.util.Arrays; import java.util.Collections; public class Demo { // 線形探索:指定した値 t のインデックスを
-
Pythonで解く「最小値が最大となる経路」問題 ― ヒープを使った貪欲法アルゴリズム
R行C列の整数で構成される行列Aが与えられます。このとき、左上のセル [0, 0] を出発点とし、右下のセル [R-1, C-1] を終点とする経路の中から、「経路上のセルのうち最小の値」をスコアとしたとき、そのスコアが最大になる経路を見つけます。例えば、ある経路が 8 → 4 → 5 → 9 と辿るとき、経路上の最小値は 4 なので、この経路のスコアは 4 となります。経路は、現在いるセルから上下左右の4方向(北・東・南・西)にある未訪問セルへ移動することで伸ばしていきます。具体例次のようなグリッドを考えてみましょう。545126746オレンジ色で示されたセルが最適な経路です。この経路上の最