MongoDBで配列内のフィールドの合計値を求める方法
MongoDBで配列内に格納されたフィールドの合計値を求めるには、集計パイプライン(aggregate)の中で $sum 演算子を使用します。この記事では、実際のコード例を使いながら、配列要素の数値を合計する手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、ドキュメントを挿入してコレクションを作成します。ここでは、生徒の名前と複数の点数(Marks)を持つ配列を含むドキュメントを作成します。
> db.demo96.insertOne(
... {
... "Name" : "Chris",
... "Details" : [
... {
... Marks: 67
... },
... {
... Marks: 33
... },
... {
... Marks: 50
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2d6aadb8903cdd865577ad")
}
上記のクエリを実行すると、Name フィールドと、3つの Marks 値を持つ Details 配列からなるドキュメントが登録されます。
2. find()メソッドで全ドキュメントを表示する
挿入したデータを確認するために、find() メソッドを使ってコレクション内のすべてのドキュメントを表示してみましょう。
> db.demo96.find();
このクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e2d6aadb8903cdd865577ad"), "Name" : "Chris", "Details" : [
{ "Marks" : 67 }, { "Marks" : 33 }, { "Marks" : 50 }
]
}
3. $sum演算子で配列内のフィールドの合計を求める
それでは、MongoDBで配列内のフィールドの合計を求めるためのクエリを見ていきましょう。ポイントは aggregate() メソッドと $project ステージを組み合わせることです。
> db.demo96.aggregate([
... { "$project": {
... "Name": 1,
... "TotalMarks": {
... "$sum": "$Details.Marks"
... }
... }}
... ]);
クエリのポイント
- $project: 出力に含めるフィールドを指定します。ここでは「Name」と新しく作成する「TotalMarks」を出力対象としています。
- $sum: "$Details.Marks": 配列内の各要素にある Marks フィールドの値をすべて合計します。ドット表記($Details.Marks)により、配列内のネストされたフィールドに直接アクセスできるのが便利な点です。
このクエリを実行すると、次のような結果が出力されます。
{ "_id" : ObjectId("5e2d6aadb8903cdd865577ad"), "Name" : "Chris", "TotalMarks" : 150 }
ご覧のとおり、67 + 33 + 50 = 150 という合計値が TotalMarks フィールドとして計算されました。
まとめ
MongoDBで配列内のフィールドの合計値を求める場合は、aggregate() の中で $project ステージを使い、$sum 演算子に「配列.フィールド名」の形式でパスを指定するだけで実現できます。売上データの集計や成績の合計計算など、さまざまなシーンで活用できる基本的かつ実用的なテクニックです。
-
MongoDBで配列内の要素を更新する方法|$setと位置演算子$の使い方を解説
MongoDBで配列内の要素を更新する基本 MongoDBでドキュメント内の配列の要素を更新するには、update()メソッドに $set 演算子と位置演算子「$」を組み合わせて使用します。この組み合わせにより、クエリ条件に一致した配列要素だけをピンポイントで書き換えることができます。 ステップ1:コレクションの作成とドキュメントの挿入 まず、insertOne() メソッドを使ってサンプルデータを登録します。ここでは、大学名(CollegeName)と学費(Fees)を含む「CollegeDetails」という配列を持つドキュメントを1件作成しました。 > db.demo494.in
-
MongoDBでオブジェクトの配列内の複数条件に一致するドキュメントを検索する方法($andと$regex活用)
MongoDBでオブジェクト(サブドキュメント)の配列内から、複数の条件を同時に満たすドキュメントを検索したい場合は、$and演算子と$regex演算子、さらに$elemMatchを組み合わせるのが効果的です。$andは、1つ以上の式からなる配列に対して論理AND演算を実行し、配列内のすべての条件を満たすドキュメントだけを選択します。また、$elemMatchを使うことで、配列内の同一要素が複数条件を満たすかどうかを正確に判定できます。サンプルコレクションの作成まず、検証用のコレクションを作成してドキュメントを挿入してみましょう。> db.demo525.insertOne({detai