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

重複レコードを含むMongoDBのコレクションから最小値と最大値を取得するクエリ

重複した値を含むコレクションから、最小値と最大値を同時に取得したいケースはよくあります。このような場合、aggregate()メソッドと$groupステージを組み合わせることで実現できます。最小値には$min演算子、最大値には$max演算子を使用します。

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

まず、ドキュメントを含むコレクションを作成しましょう。意図的に同じスコア(60)を持つドキュメントを2件登録しています。

> db.demo167.insertOne({"Score":60});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3693a79e4f06af551997d1")
}
> db.demo167.insertOne({"Score":80});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3693ab9e4f06af551997d2")
}
> db.demo167.insertOne({"Score":60});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3693ad9e4f06af551997d3")
}
> db.demo167.insertOne({"Score":90});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3693b09e4f06af551997d4")
}
> db.demo167.insertOne({"Score":89});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3693b69e4f06af551997d5")
}

登録されたドキュメントの確認

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

> db.demo167.find();

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

{ "_id" : ObjectId("5e3693a79e4f06af551997d1"), "Score" : 60 }
{ "_id" : ObjectId("5e3693ab9e4f06af551997d2"), "Score" : 80 }
{ "_id" : ObjectId("5e3693ad9e4f06af551997d3"), "Score" : 60 }
{ "_id" : ObjectId("5e3693b09e4f06af551997d4"), "Score" : 90 }
{ "_id" : ObjectId("5e3693b69e4f06af551997d5"), "Score" : 89 }

最小値と最大値を取得するクエリ

それでは、aggregate()$groupを使って最小値と最大値を取得するクエリを見てみましょう。_idフィールドに固定値を指定することで、コレクション全体を1つのグループとして扱い、その中からScoreフィールドの最小値と最大値をそれぞれ算出します。

> var d = [
...    {
...       "$group": {
...          "_id": "id",
...          "MinimumValue": { "$min": "$Score" },
...          "MaximumValue": { "$max": "$Score" }
...       }
...    }
... ]
> db.demo167.aggregate(d);

この集計パイプラインを実行すると、以下のような結果が出力されます。

{ "_id" : "id", "MinimumValue" : 60, "MaximumValue" : 90 }

クエリのポイント

  • $group: ドキュメントを指定したキーでグループ化します。ここではすべてのドキュメントを1つのグループにまとめています。
  • $min: グループ内の「Score」フィールドの最小値(60)を返します。重複があっても正しく機能します。
  • $max: グループ内の「Score」フィールドの最大値(90)を返します。

このように、たった1回の集計パイプラインで最小値と最大値を同時に取得できるため、個別にクエリを実行するよりも効率的です。大量のデータを扱う場合にも有効な手法なので、ぜひ活用してみてください。

  1. 【MySQL】VARCHAR型の列から最小値・最大値を取得し、別々の列として表示する方法

    MySQLでは、VARCHAR型の列に数値が文字列として保存されている場合、そのままMIN()やMAX()関数を使うと文字列として比較されてしまい、期待した結果が得られないことがあります。そこで、CAST()関数を使って値を数値型(SIGNED)に変換することで、正しく最小値と最大値を取得できます。この記事では、その具体的な手順を解説します。 テーブルの作成 まず、サンプルとなるテーブルを作成します。 mysql> create table DemoTable (     Value varchar(100) ); Query OK, 0 row

  2. 【Java入門】リストから最小値と最大値を取得する方法

    この記事では、Javaのリスト(List)から最小値と最大値を取得する方法を、実際に動くサンプルコードとともにわかりやすく解説します。Listは要素を順番に格納できる順序付きコレクションで、インデックスを指定して要素の挿入・更新・削除・検索を行えます。また、重複した要素を保持することも可能です。実行結果のイメージ今回作成するプログラムの入力と出力は以下のとおりです。入力:Input list: [500, 650, 300, 250, 110]出力:リストの最小値: 110 リストの最大値: 650処理の流れ(アルゴリズム)Step 1 - 処理を開始する Step 2 - リスト(input