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集計と同様の処理を柔軟に実現できます。
-
MySQLのDISTINCTとGROUP BYの違いとは?使い分け方を実例付きで解説
DISTINCTとGROUP BY、どちらを使うべき? MySQLで重複データを処理する場合、「SELECT DISTINCT」と「GROUP BY」のどちらを使えばよいか迷うことがあります。この記事では、それぞれの特徴と使い分けのポイントを、実際のSQL実行例を交えてわかりやすく解説します。 SELECT DISTINCTで重複する値を除外する SELECT DISTINCTは、指定したカラムの一意な値(重複しない値)を取得するために使います。重複レコードを取り除く目的で利用されるほか、MAXやAVGといった集計関数と組み合わせることも可能です。単一のカラムに対して適用できるのが特徴です。
-
MySQLで特定の値の出現回数をカウントする方法(COUNT関数の使い方)
MySQLでは、COUNT()関数とIF()関数を組み合わせることで、特定の値がテーブル内に何回出現するかを簡単に集計できます。この記事では、実際にデモテーブルを作成しながら、その手順をわかりやすく解説します。 1. デモ用テーブルの作成 まず、サンプルとして使用するテーブルを作成しましょう。ここでは、出荷日時と2つの数値カラムを持つ「countValueDemo」テーブルを定義します。 mysql> create table countValueDemo -> ( -> ShippingDatetime datetime, -> FirstValu