MongoDBで別のフィールドごとにグループ化された一意の値の数をカウントする方法
MongoDBであるフィールド(例:Name1)ごとにグループ化し、別のフィールド(例:Name2)の一意な値の数をカウントしたい場合は、aggregate()メソッドと$group演算子を組み合わせて使用します。この記事では、実際のサンプルコードと実行結果をもとに、具体的な手順を分かりやすく解説します。
サンプルコレクションの作成
まず、ドキュメントを格納するコレクションを作成します。以下の例では、insertOne()メソッドを使って「demo354」コレクションに5件のドキュメントを挿入しています。
> db.demo354.insertOne({"Name1":"Chris","Name2":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5685a6f8647eb59e5620c0")
}
> db.demo354.insertOne({"Name1":"Chris","Name2":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5685a9f8647eb59e5620c1")
}
> db.demo354.insertOne({"Name1":"Chris","Name2":"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5685aff8647eb59e5620c2")
}
> db.demo354.insertOne({"Name1":"Carol","Name2":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5685c4f8647eb59e5620c3")
}
> db.demo354.insertOne({"Name1":"Carol","Name2":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5685c5f8647eb59e5620c4")
}登録したドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.demo354.find();
上記のコマンドを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e5685a6f8647eb59e5620c0"), "Name1" : "Chris", "Name2" : "David" }
{ "_id" : ObjectId("5e5685a9f8647eb59e5620c1"), "Name1" : "Chris", "Name2" : "David" }
{ "_id" : ObjectId("5e5685aff8647eb59e5620c2"), "Name1" : "Chris", "Name2" : "Bob" }
{ "_id" : ObjectId("5e5685c4f8647eb59e5620c3"), "Name1" : "Carol", "Name2" : "John" }
{ "_id" : ObjectId("5e5685c5f8647eb59e5620c4"), "Name1" : "Carol", "Name2" : "John" }別のフィールドでグループ化して一意の数をカウントするクエリ
以下のクエリでは、MongoDBの集計パイプライン(アグリゲーションフレームワーク)を使用して、Name1ごとにグループ化し、それぞれに紐づく一意のName2の組み合わせ数をカウントしています。
> db.demo354.aggregate([
... {
... $group: {
... _id: {
... "Name1": "$Name1",
... "Name2": "$Name2"
... },
... }
... },
... {
... $group: {
... _id: "$_id.Name1",
... "Name2": { $sum: 1 }
... }
... },
... {
... $project: {
... _id: 0,
... Name1: "$_id",
... Name2: 1
... }
... }
... ])クエリの仕組み
- 最初の$group: Name1とName2の組み合わせごとにドキュメントをグループ化し、重複するペアを除外して一意の組み合わせだけを残します。
- 2番目の$group: Name1の値をキーとして再度グループ化し、
$sum: 1によって各Name1に紐づく一意のName2の数をカウントします。 - $project: 出力結果から_idを除外し、読みやすい形式に整形します。
このクエリを実行すると、次のような出力が得られます。
{ "Name2" : 2, "Name1" : "Chris" }
{ "Name2" : 1, "Name1" : "Carol" }この結果から、「Chris」には2つの一意なName2の値(David、Bob)が、「Carol」には1つの一意なName2の値(John)が紐づいていることが確認できます。このように、2段階の$groupを組み合わせることで、特定のフィールドを基準にした一意カウントを簡単に実現できます。
-
MongoDBですべてのドキュメントにわたる個別(ユニーク)な値をカウントする方法
MongoDBでコレクション内のすべてのドキュメントにわたって、重複を除いた個別(ユニーク)な値の数をカウントしたい場合は、aggregate()メソッドを使用します。この記事では、実際のコード例とともに、その手順をわかりやすく解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使って、デモ用のコレクション「demo718」にドキュメントを挿入します。 > db.demo718.insertOne( ... { ... id:101, ... details: ... { ... Oth
-
MongoDBでフィールド値に含まれる「@email」のような文字列を検索する方法
MongoDBのfind()メソッドを使えば、正規表現(Regex)を活用して、フィールド値の中から特定の文字列を柔軟に検索できます。本記事では、「@email」という文字列を含むドキュメントを検索する方法を、実際のコード例とともに解説します。1. 検索用コレクションの作成まずは、メールアドレスを格納したドキュメントを持つコレクションを作成しましょう。> db.demo727.insertOne({UserId:John@email.com}); { acknowledged : true, insertedId : ObjectId(5eab375f4341781127