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

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 ステージを使用し、_idnull に設定します。こうすることでコレクション全体がひとつのグループとして扱われ、すべてのドキュメントを対象に集計できます。

> 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 フレームワークを使う方が柔軟で効率的です。用途に応じて使い分けるとよいでしょう。

  1. 【Java】リスト内の最大要素と最小要素の位置(インデックス)を見つける方法

    リストや配列を扱う際、「最大値・最小値そのもの」だけでなく、それらがどの位置(インデックス)に存在するかを知りたいケースはよくあります。本記事では、Javaの Collections.max() / Collections.min() と線形探索(リニアサーチ)を組み合わせて、最大・最小要素の位置を特定するプログラムを解説します。 サンプルコード import java.util.*; import java.util.Arrays; import java.util.Collections; public class Demo { // 線形探索:指定した値 t のインデックスを

  2. Pythonで解く「最小値が最大となる経路」問題 ― ヒープを使った貪欲法アルゴリズム

    R行C列の整数で構成される行列Aが与えられます。このとき、左上のセル [0, 0] を出発点とし、右下のセル [R-1, C-1] を終点とする経路の中から、「経路上のセルのうち最小の値」をスコアとしたとき、そのスコアが最大になる経路を見つけます。例えば、ある経路が 8 → 4 → 5 → 9 と辿るとき、経路上の最小値は 4 なので、この経路のスコアは 4 となります。経路は、現在いるセルから上下左右の4方向(北・東・南・西)にある未訪問セルへ移動することで伸ばしていきます。具体例次のようなグリッドを考えてみましょう。545126746オレンジ色で示されたセルが最適な経路です。この経路上の最