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

MongoDBで各グループごとの最大値を持つドキュメントを取得する方法

MongoDBでは、集計パイプラインの $group ステージと $max 演算子を組み合わせることで、特定のフィールドでグループ化した各グループの中から最大値を持つアイテムを簡単に取得できます。この記事では、実際のコレクションを作成しながら、その手順を具体的に解説します。

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

まず、insertOne() メソッドを使って、名前・国名・点数を持つドキュメントを複数件挿入したサンプルコレクションを作成します。

> db.demo659.insertOne({Name:"Chris",CountryName:"US","Marks":50});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea1a50724113ea5458c7cf9")
}
> db.demo659.insertOne({Name:"David",CountryName:"US","Marks":60});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea1a50724113ea5458c7cfa")
}
> db.demo659.insertOne({Name:"Mike",CountryName:"US","Marks":55});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea1a50724113ea5458c7cfb")
}
> db.demo659.insertOne({Name:"Chris",CountryName:"UK","Marks":75});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea1a50724113ea5458c7cfc")
}
> db.demo659.insertOne({Name:"David",CountryName:"UK","Marks":54});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea1a50724113ea5458c7cfd")
}
> db.demo659.insertOne({Name:"Mike",CountryName:"UK","Marks":72});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea1a50824113ea5458c7cfe")
}

この例では、USUK の2つの国名(CountryName)に対して、それぞれ3人ずつの生徒データが登録されています。

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

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

> db.demo659.find();

実行すると、次のような出力が得られます。ここから、CountryName が「US」と「UK」のそれぞれのグループにおける最高得点を求めるのが目的です。

{ "_id" : ObjectId("5ea1a50724113ea5458c7cf9"), "Name" : "Chris", "CountryName" : "US", "Marks" : 50 }
{ "_id" : ObjectId("5ea1a50724113ea5458c7cfa"), "Name" : "David", "CountryName" : "US", "Marks" : 60 }
{ "_id" : ObjectId("5ea1a50724113ea5458c7cfb"), "Name" : "Mike", "CountryName" : "US", "Marks" : 55 }
{ "_id" : ObjectId("5ea1a50724113ea5458c7cfc"), "Name" : "Chris", "CountryName" : "UK", "Marks" : 75 }
{ "_id" : ObjectId("5ea1a50724113ea5458c7cfd"), "Name" : "David", "CountryName" : "UK", "Marks" : 54 }
{ "_id" : ObjectId("5ea1a50824113ea5458c7cfe"), "Name" : "Mike", "CountryName" : "UK", "Marks" : 72 }

3. 各グループの最大値を取得する集計クエリ

各グループ内で最大の項目を選択するには、aggregate() メソッドの中で $group ステージを使用し、グループ化のキーとして CountryName を指定します。そして、$max 演算子を使って Marks フィールドの最大値を計算します。

> db.demo659.aggregate( { $group: {
...     _id: {CountryName: "$CountryName" },
...     'MaxMarks': { $max : "$Marks" }
... }})

4. 実行結果

このクエリを実行すると、次のように国ごとの最高得点が出力されます。

{ "_id" : { "CountryName" : "UK" }, "MaxMarks" : 75 }
{ "_id" : { "CountryName" : "US" }, "MaxMarks" : 60 }

結果を見ると、UKグループの最高得点は75点(Chris)USグループの最高得点は60点(David)であることがわかります。

ポイントまとめ

  • $group_id に指定したフィールドがグループ化のキーになります。
  • $max は累積演算子(アキュムレータ)の一つで、グループ内の指定フィールドの最大値を返します。
  • 最小値を取得したい場合は、同様に $min 演算子に置き換えるだけで対応できます。

このように、$group$max を組み合わせれば、SQLの GROUP BY + MAX() と同じ処理をMongoDBでもシンプルに実現できます。

  1. MongoDBの$matchを使って日付条件でドキュメントを抽出する方法

    MongoDBの$matchで日付を一致させる方法MongoDBで特定の日付条件に一致するドキュメントを抽出したい場合は、集計(aggregation)フレームワークの$matchステージを使用します。$matchは、指定した条件に合致するドキュメントだけを次のパイプラインステージへ渡すフィルターの役割を果たします。この記事では、実際にコレクションを作成し、$matchを使って日付条件でデータを絞り込む手順を解説します。1. サンプルコレクションの作成まず、ShippingDate(出荷日)フィールドを持つドキュメントをいくつか作成しましょう。> db.demo491.insertOne

  2. MongoDBで平均値を超えるドキュメントを抽出する方法

    MongoDBで平均値より大きい値を持つドキュメントを抽出したい場合は、aggregate()メソッドを使用します。平均値の算出には、集計演算子の$avgを活用します。この記事では、サンプルコレクションを作成し、実際に平均値を超えるドキュメントを取得する手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってコレクションにドキュメントを挿入します。> db.demo552.insertOne({values:10});{ acknowledged : true, insertedId : ObjectId(5e8e3b1c9e5f92834d