MongoDBでカウント付きの結果を表示する「構造化された」グループ化クエリの書き方
MongoDBのaggregate()と$groupを使った構造化されたグループ化
MongoDBでドキュメントをグループ化し、各グループの出現回数(カウント)を新しいフィールドとして表示したい場合は、aggregate()メソッド内で$groupステージを使用します。$groupは、指定された_id式に基づいて入力ドキュメントをグループ化し、それぞれの異なるグループごとに1つのドキュメントを出力します。
この記事では、実際のコード例を通して、二段階の$groupを使った「構造化された」グループ化クエリの実装方法を解説します。
1. コレクションの作成とドキュメントの挿入
まず、サンプル用のコレクションを作成し、ドキュメントを挿入します。ここではinsertOne()メソッドを使用します。
> db.demo534.insertOne({_id:10,"ProductId":100,"ProductName":"Product-1"});
{ "acknowledged" : true, "insertedId" : 10 }
> db.demo534.insertOne({_id:11,"ProductId":100,"ProductName":"Product-2"});
{ "acknowledged" : true, "insertedId" : 11 }
> db.demo534.insertOne({_id:12,"ProductId":101,"ProductName":"Product-1"});
{ "acknowledged" : true, "insertedId" : 12 }2. find()メソッドですべてのドキュメントを確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo534.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : 10, "ProductId" : 100, "ProductName" : "Product-1" }
{ "_id" : 11, "ProductId" : 100, "ProductName" : "Product-2" }
{ "_id" : 12, "ProductId" : 101, "ProductName" : "Product-1" }3. 構造化されたグループ化クエリの実装
以下が、MongoDBで構造化されたグループ化を実現するクエリです。ポイントは、aggregate()の中で$groupステージを2段階に分けて使うことです。
- 第1段階:
ProductNameとProductIdの組み合わせごとにグループ化し、$sum: 1で各グループの件数をcountフィールドとして集計します。 - 第2段階:
productIdごとに再度グループ化し、$push演算子を使って商品名とカウントのペアをitemCounts配列にまとめます。
> db.demo534.aggregate(
... {
... $group:
... {
... _id:
... {
... productName: "$ProductName",
... productId: "$ProductId"
... },
... count:
... {
... $sum: 1
... }
... },
... },
... {
... $group:
... {
... _id: "$_id.productId",
... itemCounts:
... {
... "$push":
... {
... productName: "$_id.productName",
... count: "$count"
... }
... }
... }
... }
... })4. 実行結果
上記のクエリを実行すると、次のような出力が得られます。
{ "_id" : 101, "itemCounts" : [ { "productName" : "Product-1", "count" : 1 } ] }
{ "_id" : 100, "itemCounts" : [ { "productName" : "Product-2", "count" : 1 }, { "productName" : "Product-1", "count" : 1 } ] }結果の解説
この出力では、_idフィールドにProductIdが表示され、その製品に関連する各商品名(productName)と対応するカウント(count)が、itemCountsという新しい配列フィールドに構造化されて格納されています。
例えば、ProductIdが100の場合、「Product-2」と「Product-1」の2つの商品がそれぞれ1件ずつ存在することが一目でわかります。このように、二段階の$groupと$pushを組み合わせることで、ネストされた読みやすい集計結果を得ることができます。
-
【MongoDB】$addFieldsで新しいフィールドを追加し、価格を特定の数値で割った結果を連結する方法
MongoDBで既存のドキュメントに新しいフィールドを追加するには、集計パイプラインの$addFieldsステージを使用します。本記事では、ネストされた配列内の商品価格(ProductPrice)を特定の数値で割り、その結果を文字列として連結して新しいフィールドに格納する方法を、サンプルコードとともに解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ドキュメントを含むコレクションを作成します。 > db.demo719.insertOne( ... { ... Number:7374644, ... de
-
MySQLで個別の値の出現回数をカウントし、結果を新しい列として表示する方法
MySQLでは、GROUP BY句とCOUNT()関数を組み合わせることで、各値が何回出現したかを簡単に集計できます。この記事では、実際にテーブルを作成し、重複する値の出現回数をカウントして結果を表示する手順を解説します。 1. サンプルテーブルの作成 まず、集計対象となるテーブルを作成しましょう。 mysql> create table DemoTable ( Value int ); Query OK, 0 rows affected (0.57 sec) 2. テストデータの挿入 INSERTコマンドを使って、いくつかのレコードを挿入します。意図的に同じ値を複数回登録し