MongoDBのaggregate()で出現回数をカウントし、上位ユーザーを抽出する方法
MongoDBでドキュメントの出現回数を数え、最も多く登場するユーザー(上位ユーザー)を取得したい場合は、aggregate()メソッドと$groupステージを組み合わせるのが定番のアプローチです。SQLにおける「GROUP BY + COUNT + ORDER BY」に相当する処理を、MongoDBのアグリゲーションパイプラインで実現できます。
サンプルコレクションの作成
まず、動作確認用のコレクションを作成します。insertOne()を使って複数のドキュメントを挿入していきましょう。
> db.demo264.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed441627c0c63e7dba9e")
}
> db.demo264.insertOne({"Name":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed471627c0c63e7dba9f")
}
> db.demo264.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed491627c0c63e7dbaa0")
}
> db.demo264.insertOne({"Name":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed4c1627c0c63e7dbaa1")
}
> db.demo264.insertOne({"Name":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed4e1627c0c63e7dbaa2")
}
> db.demo264.insertOne({"Name":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e47ed531627c0c63e7dbaa3")
}登録したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo264.find();
上記のクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e47ed441627c0c63e7dba9e"), "Name" : "Chris" }
{ "_id" : ObjectId("5e47ed471627c0c63e7dba9f"), "Name" : "David" }
{ "_id" : ObjectId("5e47ed491627c0c63e7dbaa0"), "Name" : "Chris" }
{ "_id" : ObjectId("5e47ed4c1627c0c63e7dbaa1"), "Name" : "Bob" }
{ "_id" : ObjectId("5e47ed4e1627c0c63e7dbaa2"), "Name" : "Chris" }
{ "_id" : ObjectId("5e47ed531627c0c63e7dbaa3"), "Name" : "Bob" }出現回数が多い順に上位ユーザーを取得するクエリ
MongoDBでCOUNT相当の処理を行い、出現回数の多い上位ユーザーを検索するには、以下のようにアグリゲーションパイプラインを構成します。
- $group:
_idに$Nameを指定して名前ごとにグループ化し、$sumで各グループの件数をカウントします。 - $sort:カウント値を降順(-1)にソートして、出現回数の多い順に並べ替えます。
- $limit:上位5件だけを取得するよう件数を制限します。
> db.demo264.aggregate(
... {$group : {_id : "$Name", "count" : {$sum : 1}}},
... {$sort : {"count" : -1}},
... {$limit : 5}
...)このクエリを実行すると、次のような結果が出力されます。
{ "_id" : "Chris", "count" : 3 }
{ "_id" : "Bob", "count" : 2 }
{ "_id" : "David", "count" : 1 }ポイントまとめ
このように、$groupでグループ化しながら$sum : 1で件数を集計し、$sortと$limitを組み合わせることで、SQLの「GROUP BY・COUNT・ORDER BY・LIMIT」に相当する処理を簡単に実装できます。ランキング形式のデータ集計や、ログ解析などで頻出するパターンなので、ぜひ覚えておきましょう。
-
MongoDBでfind()を使って名前からユーザーを検索する方法
MongoDBでユーザーの名前をキーにドキュメントを検索したい場合は、find()メソッドを使用します。この記事では、実際にコレクションを作成し、名前を指定してユーザーを取得する手順を順番に解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使ってサンプル用のコレクション「demo504」にドキュメントを挿入します。> db.demo504.insertOne({Name:Chris});{ acknowledged : true, insertedId : ObjectId(5e8823ee987b6e0e9d18f570) } &
-
MongoDBの集計パイプラインで複数フィールドをカウントする方法($facet活用)
MongoDBで複数のフィールドごとにドキュメントをカウントしたい場合、$facet演算子を使うのが効果的です。$facetは、同じ入力ドキュメント群に対して、単一のステージ内で複数の集計パイプラインを同時に処理できる強力な機能です。この記事では、実際にコレクションを作成し、$facetを組み合わせた集計クエリで複数フィールドの値をカウントする手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってサンプルドキュメントを挿入します。各ドキュメントにはdetails1・details2・details3という3つのネストされたフィールドを持たせます。>