MongoDBの集計フレームワークでNAMEフィールドに含まれる重複名の出現頻度を計算する方法
MongoDBで特定のフィールド(ここでは「Name」フィールド)に含まれる値がそれぞれ何回出現するかを調べたい場合、aggregate()メソッドと$group演算子を組み合わせることで簡単に実現できます。この記事では、サンプルコレクションを作成し、重複する名前の頻度を集計する手順を解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成します。
> db.demo635.insertOne({Name:"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c10f06c954c74be91e6cc")
}
> db.demo635.insertOne({Name:"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c10f46c954c74be91e6cd")
}
> db.demo635.insertOne({Name:"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c10f66c954c74be91e6ce")
}
> db.demo635.insertOne({Name:"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c10f86c954c74be91e6cf")
}
> db.demo635.insertOne({Name:"Bob"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c10fb6c954c74be91e6d0")
}
> db.demo635.insertOne({Name:"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c10fc6c954c74be91e6d1")
}
上記のコレクションには、「Chris」が3件、「David」が2件、「Bob」が1件登録されています。
2. 登録されたドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.demo635.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e9c10f06c954c74be91e6cc"), "Name" : "Chris" }
{ "_id" : ObjectId("5e9c10f46c954c74be91e6cd"), "Name" : "David" }
{ "_id" : ObjectId("5e9c10f66c954c74be91e6ce"), "Name" : "David" }
{ "_id" : ObjectId("5e9c10f86c954c74be91e6cf"), "Name" : "Chris" }
{ "_id" : ObjectId("5e9c10fb6c954c74be91e6d0"), "Name" : "Bob" }
{ "_id" : ObjectId("5e9c10fc6c954c74be91e6d1"), "Name" : "Chris" }
3. 集計パイプラインで出現頻度を計算する
ここからが本題です。MongoDBの集計フレームワーク(Aggregation Framework)を使って、各名前の出現頻度を計算します。ポイントは以下の2つのステージです。
- $unwind: 配列フィールドを個別のドキュメントに展開します。今回のように単一の文字列フィールドに対しても使用できます。
- $group:
_idにグループ化したいフィールド($Name)を指定し、$sum: 1で各グループのドキュメント数をカウントします。
実際のクエリは次のとおりです。
> db.demo635.aggregate([
... { $unwind: "$Name" },
... { $group: { "_id": "$Name", TotalFrequency: { $sum : 1 } } }
... ]
... );
実行すると、次のような結果が出力されます。
{ "_id" : "David", "TotalFrequency" : 2 }
{ "_id" : "Bob", "TotalFrequency" : 1 }
{ "_id" : "Chris", "TotalFrequency" : 3 }
結果の見方と補足
この結果から、「Chris」は3回、「David」は2回、「Bob」は1回出現していることがわかります。TotalFrequencyという新しいフィールドに、各名前の合計出現回数が格納されています。
なお、$unwindステージは配列を展開するためのものであり、今回のように通常の文字列フィールドの場合は省略しても同じ結果が得られます。ただし、「Name」フィールドが配列形式で保存されているデータ(例:{ Name: ["Chris", "David"] })も扱う可能性がある場合は、$unwindを入れておくことで柔軟に対応できます。
さらに、結果を読みやすくソートしたい場合は、最後に{ $sort: { TotalFrequency: -1 } }ステージを追加すると、出現頻度の高い順に並べ替えることができます。
-
MongoDBシェルで特定の値を持つドキュメントを取得する方法をわかりやすく解説
MongoDBシェルを使って特定の値を持つアイテムを取得する方法MongoDBで特定の値を持つドキュメントを取得したい場合、find()メソッドを使用するのが基本です。この記事では、サンプルコレクションを作成し、実際にfind()メソッドを使って条件に合うデータを抽出する手順を詳しく解説します。1. サンプルコレクションの作成まずはinsertOne()メソッドを使って、テスト用のコレクション「demo563」に複数のドキュメントを挿入します。> db.demo563.insertOne({Name:Chris,Age:21,isMarried:true}){ acknowled
-
MongoDB集計パイプラインで重複するNameフィールド値ごとの出現回数を取得する方法
MongoDBでは、$unwindと$groupを組み合わせた集計(アグリゲーション)パイプラインを使うことで、配列内に存在する重複したフィールド値を名前ごとにグループ化し、それぞれの出現回数を簡単に取得できます。ここでは、具体的な例をもとにその手順を解説します。サンプルコレクションの作成まずは、ドキュメントを含むコレクションを作成してみましょう。以下の例では、demo558というコレクションに、国コードと複数人の受講科目情報を持つドキュメントを挿入します。> db.demo558.insertOne( ... { ... _id : 100, ... CountryCode