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

MongoDBでSELECT COUNTとGROUP BYを実現する方法

MongoDBでSQLの「SELECT COUNT ... GROUP BY」に相当する集計処理を行いたい場合は、アグリゲーションフレームワーク(Aggregation Framework)を使用します。$groupステージと$sum演算子を組み合わせることで、特定のフィールドの値ごとにドキュメント数を数えることができます。

概念を理解するために、まずドキュメントを含むコレクションを作成しましょう。コレクションを作成するクエリは以下の通りです。

> db.countGroupByDemo.insertOne({"StudentId":10,"StudentName":"John"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7700871e9c5dd6f1f78296")
}
> db.countGroupByDemo.insertOne({"StudentId":10,"StudentName":"Carol"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c77008f1e9c5dd6f1f78297")
}
> db.countGroupByDemo.insertOne({"StudentId":20,"StudentName":"Sam"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7700971e9c5dd6f1f78298")
}
> db.countGroupByDemo.insertOne({"StudentId":30,"StudentName":"Mike"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7700a21e9c5dd6f1f78299")
}
> db.countGroupByDemo.insertOne({"StudentId":30,"StudentName":"David"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7700aa1e9c5dd6f1f7829a")
}
> db.countGroupByDemo.insertOne({"StudentId":10,"StudentName":"Maxwell"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7700b41e9c5dd6f1f7829b")
}
> db.countGroupByDemo.insertOne({"StudentId":20,"StudentName":"Bob"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7700bd1e9c5dd6f1f7829c")
}

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

> db.countGroupByDemo.find().pretty();

出力結果

{
   "_id" : ObjectId("5c7700871e9c5dd6f1f78296"),
   "StudentId" : 10,
   "StudentName" : "John"
}
{
   "_id" : ObjectId("5c77008f1e9c5dd6f1f78297"),
   "StudentId" : 10,
   "StudentName" : "Carol"
}
{
   "_id" : ObjectId("5c7700971e9c5dd6f1f78298"),
   "StudentId" : 20,
   "StudentName" : "Sam"
}
{
   "_id" : ObjectId("5c7700a21e9c5dd6f1f78299"),
   "StudentId" : 30,
   "StudentName" : "Mike"
}
{
   "_id" : ObjectId("5c7700aa1e9c5dd6f1f7829a"),
   "StudentId" : 30,
   "StudentName" : "David"
}
{
   "_id" : ObjectId("5c7700b41e9c5dd6f1f7829b"),
   "StudentId" : 10,
   "StudentName" : "Maxwell"
}
{
   "_id" : ObjectId("5c7700bd1e9c5dd6f1f7829c"),
   "StudentId" : 20,
   "StudentName" : "Bob"
}

COUNT GROUP BYを実行するクエリ

それでは、グループごとの件数を集計するクエリを見てみましょう。aggregate()メソッドの中で、$groupステージによってStudentIdフィールドでグループ化し、$sum演算子で各グループのドキュメント数をカウントしています。

> db.countGroupByDemo.aggregate([
... {"$group":{_id:"$StudentId",counter:{$sum:1}}}]);

出力結果

{ "_id" : 30, "counter" : 2 }
{ "_id" : 20, "counter" : 2 }
{ "_id" : 10, "counter" : 3 }

結果の読み方とポイント

  • _idフィールド:グループ化のキーとなった値(この例ではStudentId)が表示されます。
  • counterフィールド:そのグループに属するドキュメントの件数が表示されます。
  • $group_idに指定したフィールドの値を基準にドキュメントをグループ化します。SQLのGROUP BYに相当します。
  • {$sum: 1}:グループ内のドキュメント1件につき1を加算するため、COUNT(*)と同じ集計結果が得られます。

この実行結果から、StudentIdが10の学生は3名、20の学生は2名、30の学生は2名いることがわかります。このように、MongoDBではアグリゲーションパイプラインを活用することで、リレーショナルデータベースのGROUP BY集計と同様の処理を柔軟に実現できます。

  1. MySQLのDISTINCTとGROUP BYの違いとは?使い分け方を実例付きで解説

    DISTINCTとGROUP BY、どちらを使うべき? MySQLで重複データを処理する場合、「SELECT DISTINCT」と「GROUP BY」のどちらを使えばよいか迷うことがあります。この記事では、それぞれの特徴と使い分けのポイントを、実際のSQL実行例を交えてわかりやすく解説します。 SELECT DISTINCTで重複する値を除外する SELECT DISTINCTは、指定したカラムの一意な値(重複しない値)を取得するために使います。重複レコードを取り除く目的で利用されるほか、MAXやAVGといった集計関数と組み合わせることも可能です。単一のカラムに対して適用できるのが特徴です。

  2. MySQLで特定の値の出現回数をカウントする方法(COUNT関数の使い方)

    MySQLでは、COUNT()関数とIF()関数を組み合わせることで、特定の値がテーブル内に何回出現するかを簡単に集計できます。この記事では、実際にデモテーブルを作成しながら、その手順をわかりやすく解説します。 1. デモ用テーブルの作成 まず、サンプルとして使用するテーブルを作成しましょう。ここでは、出荷日時と2つの数値カラムを持つ「countValueDemo」テーブルを定義します。 mysql> create table countValueDemo -> ( -> ShippingDatetime datetime, -> FirstValu