MongoDBで重複するドキュメントの列値ごとにスコアを合計する方法
複数のドキュメントにまたがって重複する値(同じ名前など)を持つフィールドのスコアを合計したい場合、MongoDBでは$group演算子を使用します。この記事では、実際にコレクションを作成しながら、集計パイプライン(Aggregation Pipeline)を使ってスコアを合計する手順を詳しく解説します。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。
> db.demo512.insertOne({"Name":"Chris","Score1":45,"Score2":65,"CountryName":"US"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e884d96987b6e0e9d18f588")
}
> db.demo512.insertOne({"Name":"Chris","Score1":41,"Score2":45,"CountryName":"US"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e884da2987b6e0e9d18f589")
}
> db.demo512.insertOne({"Name":"Bob","Score1":75,"Score2":55,"CountryName":"US"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e884db2987b6e0e9d18f58a")
}
> db.demo512.insertOne({"Name":"Bob","Score1":65,"Score2":90,"CountryName":"US"});{
"acknowledged" : true,
"insertedId" : ObjectId("5e884dc2987b6e0e9d18f58b")
}
find()メソッドですべてのドキュメントを表示する
find()メソッドを使用して、コレクション内のすべてのドキュメントを表示します。
> db.demo512.find();
これにより、次のような出力が得られます。
{ "_id" : ObjectId("5e884d96987b6e0e9d18f588"), "Name" : "Chris", "Score1" : 45, "Score2" :
65, "CountryName" : "US" }
{ "_id" : ObjectId("5e884da2987b6e0e9d18f589"), "Name" : "Chris", "Score1" : 41, "Score2" :
45, "CountryName" : "US" }
{ "_id" : ObjectId("5e884db2987b6e0e9d18f58a"), "Name" : "Bob", "Score1" : 75, "Score2" :
55, "CountryName" : "US" }
{ "_id" : ObjectId("5e884dc2987b6e0e9d18f58b"), "Name" : "Bob", "Score1" : 65, "Score2" :
90, "CountryName" : "US" }
重複する列値のスコアを合計するクエリ
以下は、MongoDBで重複する「Name」の値ごとにScore1とScore2を合計する集計クエリです。
> db.demo512.aggregate([
... {
... "$group": {
... "_id": "$Name",
... "Score1": { "$sum": "$Score1" },
... "Score2": { "$sum": "$Score2" },
... "CountryName": { "$first": "$CountryName" }
... }
... },
... {
... "$project": {
... "_id": 0,
... "Name": "$_id",
... "Score1": 1,
... "Score2": 1,
... "CountryName": 1
... }
... },
... { "$out": "demo513" }
... ])
クエリのポイント
- $group:「Name」フィールドをキーとしてドキュメントをグループ化し、$sumで各グループのScore1・Score2を合計します。
- $first:各グループ内で最初に出現した「CountryName」の値をそのまま取得します。
- $project:出力から「_id」を除外し、グループ化のキーだった「$_id」を「Name」として読みやすい形に整形します。
- $out:集計結果を新しいコレクション「demo513」に保存します。
結果の確認
集計結果を表示するには、保存先の新しいコレクションに対してfind()を実行します。
> db.demo513.find();
これにより、次のような出力が得られます。
{ "_id" : ObjectId("5e884f0e79442efd15c6eae0"), "Score1" : 140, "Score2" : 145, "CountryName" : "US", "Name" : "Bob" }
{ "_id" : ObjectId("5e884f0e79442efd15c6eae1"), "Score1" : 86, "Score2" : 110, "CountryName" : "US", "Name" : "Chris" }
結果を見ると、ChrisのScore1は45+41=86、Score2は65+45=110に、BobのScore1は75+65=140、Score2は55+90=145にそれぞれ正しく合計されていることが確認できます。このように$groupと$sumを組み合わせることで、重複する値を持つドキュメントの数値を簡単に集計できます。
-
MySQLで列の値を合計する方法|SUM関数の使い方を解説
MySQLである列の値の合計を求めたい場合は、集計関数 SUM() を使用します。SUM関数は、指定したカラム(列)に格納されている数値をすべて加算し、その合計値を1つの結果として返してくれる便利な関数です。ここでは、実際にサンプルテーブルを作成し、SUM関数で列の合計値を取得する手順を順番に見ていきましょう。1. サンプルテーブルの作成まずは、CREATE TABLE文でテスト用のテーブルを作成します。 ); Query OK, 0 rows affected (0.71 sec)この例では、自動採番される主キー「Id」と、金額を格納する整数型のカラム「€」を持つテーブルを作成しています。2
-
MySQLで1つの列から重複する値の出現回数を取得する方法
MySQLでは、GROUP BY句とCOUNT(*)関数を組み合わせることで、単一の列に含まれる重複した値がそれぞれ何回出現しているかを簡単に集計できます。ここでは、実際の手順をサンプルコード付きで解説します。 1. サンプルテーブルを作成する まず、数値を格納するシンプルなテーブルを作成しましょう。 mysql> create table DemoTable -> ( -> Number int -> ); Query OK, 0 rows affected (0.83 sec) 2. テストデータを挿入する INSERTコマンドを使って、意図的