MongoDBの集約パイプラインでフィールドを結合・マージしてカウントする方法
MongoDBでフィールドを結合またはマージした上で件数を数えたい場合、$group演算子を$sumや$sortと組み合わせて使用します。この記事では、実際にコレクションを作成し、集約パイプラインを使って科目ごとのドキュメント数を集計する手順を解説します。
サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを作成します。
> db.demo647.insertOne({"Subject":"MySQL"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c86316c954c74be91e6ee")
}
> db.demo647.insertOne({"Subject":"MongoDB"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c86356c954c74be91e6ef")
}
> db.demo647.insertOne({"Subject":"MySQL"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c86376c954c74be91e6f0")
}
> db.demo647.insertOne({"Subject":"SQL Server"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c86406c954c74be91e6f1")
}
> db.demo647.insertOne({"Subject":"MongoDB"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c86436c954c74be91e6f2")
}
> db.demo647.insertOne({"Subject":"PL/SQL"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c864b6c954c74be91e6f3")
}
> db.demo647.insertOne({"Subject":"MongoDB"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c86c16c954c74be91e6f4")
}登録したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo647.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e9c86316c954c74be91e6ee"), "Subject" : "MySQL" }
{ "_id" : ObjectId("5e9c86356c954c74be91e6ef"), "Subject" : "MongoDB" }
{ "_id" : ObjectId("5e9c86376c954c74be91e6f0"), "Subject" : "MySQL" }
{ "_id" : ObjectId("5e9c86406c954c74be91e6f1"), "Subject" : "SQL Server" }
{ "_id" : ObjectId("5e9c86436c954c74be91e6f2"), "Subject" : "MongoDB" }
{ "_id" : ObjectId("5e9c864b6c954c74be91e6f3"), "Subject" : "PL/SQL" }
{ "_id" : ObjectId("5e9c86c16c954c74be91e6f4"), "Subject" : "MongoDB" }フィールドをグループ化してカウントするクエリ
ここからが本題です。以下のクエリでは、aggregate()メソッド内で$groupによって「Subject」フィールドごとにドキュメントをまとめ、$sumで各グループの件数をカウントしています。さらに$sortでカウントの降順に並べ替え、$limitで上位2件のみを取得しています。
> db.demo647.aggregate([
{ "$group": { "_id": "$Subject", "COUNT": { "$sum": 1 } } },
{ "$sort": { "COUNT": -1 } },
{ "$limit": 2 }
] );このクエリを実行すると、次のような出力が得られます。
{ "_id" : "MongoDB", "COUNT" : 3 }
{ "_id" : "MySQL", "COUNT" : 2 }クエリのポイント
- $group:「_id」に「$Subject」を指定することで、同じ値を持つフィールド同士が結合(マージ)され、1つのグループとして扱われます。
- $sum: 1:各グループに属するドキュメントの件数をカウントします。
- $sort: { COUNT: -1 }:カウント結果を降順で並べ替えます。
- $limit:上位N件だけを取得したい場合に便利です。
このように、$groupと$sumを組み合わせた集約パイプラインを使えば、特定のフィールドの値ごとにドキュメントをマージして簡単に件数を集計できます。
-
MongoDBの集計パイプラインで複数フィールドをカウントする方法($facet活用)
MongoDBで複数のフィールドごとにドキュメントをカウントしたい場合、$facet演算子を使うのが効果的です。$facetは、同じ入力ドキュメント群に対して、単一のステージ内で複数の集計パイプラインを同時に処理できる強力な機能です。この記事では、実際にコレクションを作成し、$facetを組み合わせた集計クエリで複数フィールドの値をカウントする手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってサンプルドキュメントを挿入します。各ドキュメントにはdetails1・details2・details3という3つのネストされたフィールドを持たせます。>
-
MongoDBの集約(Aggregation)と投影(Projection)の使い方を解説
MongoDBの集約と投影とはMongoDBで特定のフィールドだけを抽出しながらデータを加工したい場合、aggregate()メソッドと$projectステージを組み合わせるのが効果的です。$projectは、パイプライン内で指定されたフィールドを持つドキュメントだけを次のステージへ渡す役割を果たします。この記事では、実際にコレクションを作成し、$match・$unwind・$sort・$group・$projectを組み合わせた集約パイプラインの具体的な使い方を解説します。サンプルコレクションの作成まず、insertOne()を使ってドキュメントを含むコレクションを作成します。> db