MongoDBでaggregate()を使ってフィールドごとにグループ化し、件数を集計する方法
MongoDBでの集計とグループ化の基本
MongoDBのaggregate()メソッドでは、$groupステージを利用することで、コレクション内のドキュメントを特定のフィールドの値ごとにグループ化し、件数を集計できます。本記事では、実際にサンプルコレクションを作成しながら、その手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。
> db.demo616.insertOne({"details":{"Name":"Chris","Age":21}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99bfac65492f6c60d00283")
}
> db.demo616.insertOne({"details":{"Name":"Chris","Age":22}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99bfb065492f6c60d00284")
}
> db.demo616.insertOne({"details":{"Name":"Bob","Age":23}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99bfb865492f6c60d00285")
}
> db.demo616.insertOne({"details":{"Name":"Sam","Age":21}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99bfbd65492f6c60d00286")
}
> db.demo616.insertOne({"details":{"Name":"Chris","Age":24}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99bfc165492f6c60d00287")
}2. find()メソッドで全ドキュメントを表示
作成したコレクションの内容は、find()メソッドで確認できます。
> db.demo616.find();
上記のコマンドを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e99bfac65492f6c60d00283"), "details" : { "Name" : "Chris", "Age" : 21 } }
{ "_id" : ObjectId("5e99bfb065492f6c60d00284"), "details" : { "Name" : "Chris", "Age" : 22 } }
{ "_id" : ObjectId("5e99bfb865492f6c60d00285"), "details" : { "Name" : "Bob", "Age" : 23 } }
{ "_id" : ObjectId("5e99bfbd65492f6c60d00286"), "details" : { "Name" : "Sam", "Age" : 21 } }
{ "_id" : ObjectId("5e99bfc165492f6c60d00287"), "details" : { "Name" : "Chris", "Age" : 24 } }3. $groupを使った集計クエリの実行
続いて、コレクションを集計し、フィールドの値ごとにグループ化して件数をカウントするクエリを見ていきましょう。
> db.demo616.aggregate(
... [
... {
... $group:{_id:"$details.Name",Total:{$sum:1}}}
... ]
... );このクエリを実行すると、以下のような結果が出力されます。
{ "_id" : "Sam", "Total" : 1 }
{ "_id" : "Bob", "Total" : 1 }
{ "_id" : "Chris", "Total" : 3 }クエリのポイント解説
この集計パイプラインの重要なポイントは以下の2点です。
- _id:「$details.Name」:グループ化のキーとして、ネストされたフィールドである「details.Name」を指定しています。ドット記法を使うことで、サブドキュメント内のフィールドも参照できます。
- Total:{$sum:1}:各グループに含まれるドキュメントの数を合計しています。
$sumに1を指定すると、ドキュメント1件につき1ずつ加算されるため、結果的に各グループの件数(カウント)が求まります。
実行結果から、「Chris」が3件、「Bob」と「Sam」がそれぞれ1件存在していることが確認できます。このように$groupと$sumを組み合わせることで、SQLにおけるGROUP BY句とCOUNT関数に相当する処理を、MongoDBでもシンプルに実現できます。年齢やその他のフィールドをキーにしたい場合は、_idに指定するフィールド名を変更するだけで応用可能です。
-
MongoDBコレクション内のすべてのドキュメントに新しいフィールドを追加する方法
MongoDBコレクション内のすべてのドキュメントに新しいフィールドを追加する方法MongoDBで既存のドキュメントに新しいフィールドを追加するには、集計パイプラインの$addFieldsステージを使用します。まずは、サンプルとなるコレクションとドキュメントを作成してみましょう。サンプルコレクションの作成insertOne()メソッドを使用して、ドキュメントを1件ずつ挿入します。> db.demo712.insertOne({Name:John}); { acknowledged : true, insertedId : ObjectId(5ea85f675d33e20ed1
-
MongoDB 4でドキュメントをソートし、特定の1つのフィールドだけを表示する方法
MongoDB 4でドキュメントを並べ替えるには、sort()メソッドを使用します。さらに、ソートした特定の1つのフィールドのみを表示したい場合は、プロジェクション(射影)を組み合わせて、表示したいフィールドに「1」を設定します。この記事では、実際のコード例を使って手順を順番に解説していきます。1. サンプルコレクションの作成まず、insertOne()メソッドを使って、テスト用のコレクション「demo611」にドキュメントを登録します。> db.demo611.insertOne({Name:Chris}); { acknowledged : true, insertedI