MongoDBの集計パイプラインで特定の学生のスコアを合計する方法($sum演算子の活用)
MongoDBで数値の合計を求めるには、aggregate()メソッドと$sum演算子を組み合わせて使用します。この記事では、特定の学生のスコアを合計する具体的な手順を、サンプルコードとともに解説します。
1. サンプルコレクションの作成
まずは、ドキュメントを格納したコレクションを作成しましょう。ここではdemo434というコレクションに、学生の名前とスコアのデータを挿入します。
> db.demo434.insertOne({"Name":"Chris","Score":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e771603bbc41e36cc3cae93")
}
> db.demo434.insertOne({"Name":"David","Score":55});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e77161abbc41e36cc3cae94")
}
> db.demo434.insertOne({"Name":"Chris","Score":55});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e771624bbc41e36cc3cae95")
}2. 登録されたドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo434.find();
上記のコマンドを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e771603bbc41e36cc3cae93"), "Name" : "Chris", "Score" : 45 }
{ "_id" : ObjectId("5e77161abbc41e36cc3cae94"), "Name" : "David", "Score" : 55 }
{ "_id" : ObjectId("5e771624bbc41e36cc3cae95"), "Name" : "Chris", "Score" : 55 }3. 特定の学生のスコアを合計するクエリ
ここからが本題です。特定の学生(この例では「Chris」)のスコアを合計するには、集計パイプラインの中で$matchステージと$groupステージを組み合わせます。
- $match: 条件に一致するドキュメントだけを抽出します(ここでは「Name」が「Chris」のドキュメント)。
- $group: 抽出したドキュメントをグループ化し、
$sum演算子で「Score」フィールドの合計値を計算します。
> db.demo434.aggregate([
... { "$match": { "Name": "Chris"} },
... { "$group": { "_id": null, "TotalScore": { "$sum": "$Score" } } }
... ]);このクエリを実行すると、以下の出力が得られます。
{ "_id" : null, "TotalScore" : 100 }結果の解説
出力を見ると、「Chris」のスコアである45と55が合計され、TotalScoreとして100が返されていることがわかります。_idがnullになっているのは、$groupステージですべての一致ドキュメントを単一のグループとして扱っているためです。
このように、$matchで対象を絞り込み、$groupと$sumで集計するという流れは、MongoDBにおける基本的かつ強力なデータ集計パターンです。条件を変更すれば、任意の学生や任意のフィールドに対して同じ手法を応用できます。
-
MongoDBの集約(Aggregation)で特定のフィールド値を持つドキュメントを取得する方法
特定の条件に一致するドキュメントを取得したい場合には、aggregate() メソッドを使用します。ここでは、フィールド「Age」の値が「21」であるドキュメントを取得するケースを例に解説します。 サンプルコレクションの作成 まずは、ドキュメントを含むコレクションを作成しましょう。 > db.demo685.insertOne( ... { ... details: ... [ ... { ... Name:Chris, ... Age:21 ... }, ..
-
MongoDBの集約(Aggregation)と投影(Projection)の使い方を解説
MongoDBの集約と投影とはMongoDBで特定のフィールドだけを抽出しながらデータを加工したい場合、aggregate()メソッドと$projectステージを組み合わせるのが効果的です。$projectは、パイプライン内で指定されたフィールドを持つドキュメントだけを次のステージへ渡す役割を果たします。この記事では、実際にコレクションを作成し、$match・$unwind・$sort・$group・$projectを組み合わせた集約パイプラインの具体的な使い方を解説します。サンプルコレクションの作成まず、insertOne()を使ってドキュメントを含むコレクションを作成します。> db