MongoDB集計パイプラインで重複するNameフィールド値ごとの出現回数を取得する方法
MongoDBでは、$unwindと$groupを組み合わせた集計(アグリゲーション)パイプラインを使うことで、配列内に存在する重複したフィールド値を名前ごとにグループ化し、それぞれの出現回数を簡単に取得できます。ここでは、具体的な例をもとにその手順を解説します。
サンプルコレクションの作成
まずは、ドキュメントを含むコレクションを作成してみましょう。以下の例では、demo558というコレクションに、国コードと複数人の受講科目情報を持つドキュメントを挿入します。
> db.demo558.insertOne(
... {
... _id : 100,
... CountryCode:101,
... details: [
... {
... Name:"Chris",
... Subject:"MySQL"
... },
... {
... Name:"Chris",
... Subject:"MongoDB"
... },
... {
... Name:"Chris",
... Subject:"Java"
... },
... {
... Name:"Bob",
... Subject:"Python"
... },
... {
... Name:"Bob",
... Subject:"Java"
... }
... ]
... }
... )
{ "acknowledged" : true, "insertedId" : 100 }登録されたドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.demo558.find();
このクエリを実行すると、以下のような出力が得られます。
{ "_id" : 100, "CountryCode" : 101, "details" : [
{ "Name" : "Chris", "Subject" : "MySQL" },
{ "Name" : "Chris", "Subject" : "MongoDB" },
{ "Name" : "Chris", "Subject" : "Java" },
{ "Name" : "Bob", "Subject" : "Python" },
{ "Name" : "Bob", "Subject" : "Java" }
] }重複する名前ごとのカウントを取得するクエリ
それでは、本題である「同じNameフィールド値がいくつ存在するか」を取得するための集計クエリを見ていきましょう。ポイントは以下の3つのステージです。
- $unwind:
details配列を展開し、各要素を個別のドキュメントとして扱えるようにします。 - $group:
Nameフィールドをキーにグループ化し、$sum: 1で出現回数をカウントすると同時に、$pushで各グループの科目(Subject)を配列にまとめます。 - $project:
$size演算子を使って、まとめた科目配列の要素数(=科目数)も算出します。
実際のクエリは以下の通りです。
> db.demo558.aggregate([
... {$unwind: "$details" },
... {$group: { _id: "$details.Name", NameCount:{$sum : 1}, Subject : {$push: "$details.Subject"}}},
... {$project: { NameCount: 1, SubjectCount : {$size: "$Subject"}}}
... ]).pretty()実行結果
上記の集計クエリを実行すると、次のような結果が出力されます。
{ "_id" : "Bob", "NameCount" : 2, "SubjectCount" : 2 }
{ "_id" : "Chris", "NameCount" : 3, "SubjectCount" : 3 }この結果から、「Chris」という名前は3回出現し、対応する科目も3つ、「Bob」という名前は2回出現し、対応する科目も2つあることが一目でわかります。このように$unwind・$group・$projectを組み合わせることで、ネストされた配列データの中から重複値の集計を柔軟に行うことが可能です。
-
MongoDBでフィールドの戻り値を制限するクエリの書き方($slice演算子の使い方)
MongoDBでフィールドの戻り値を制限するクエリの書き方MongoDBで配列フィールドの要素数を制限して取得したい場合は、$slice演算子を使用します。この演算子を活用することで、クエリ結果として返す配列の要素数を柔軟にコントロールできます。ここでは、具体的な手順をサンプルコードとともに解説します。1. コレクションとドキュメントの作成まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。> db.demo594.insertOne(... {... &n
-
MySQLで1つの列から重複する値の出現回数を取得する方法
MySQLでは、GROUP BY句とCOUNT(*)関数を組み合わせることで、単一の列に含まれる重複した値がそれぞれ何回出現しているかを簡単に集計できます。ここでは、実際の手順をサンプルコード付きで解説します。 1. サンプルテーブルを作成する まず、数値を格納するシンプルなテーブルを作成しましょう。 mysql> create table DemoTable -> ( -> Number int -> ); Query OK, 0 rows affected (0.83 sec) 2. テストデータを挿入する INSERTコマンドを使って、意図的