MongoDBで特定条件のキー値を合計する方法|$matchとaggregate()を使った集計クエリ
MongoDBで特定の条件に一致するドキュメントのキー値を合計したい場合、aggregate()メソッドと$matchステージを組み合わせるのが基本です。この記事では、実際のコマンド例を通して、特定の名前と年齢に一致するドキュメントの「Marks(点数)」を合計する方法を解説します。
サンプルコレクションの作成
まずは動作確認用のコレクションを作成し、ドキュメントを挿入します。ここではinsertOne()を使って4件のドキュメントを登録します。
> db.demo329.insertOne({"Name":"Chris","Age":21,"Marks":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516f28f8647eb59e56207d")
}
> db.demo329.insertOne({"Name":"David","Age":21,"Marks":56});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516f28f8647eb59e56207e")
}
> db.demo329.insertOne({"Name":"Mike","Age":21,"Marks":78});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516f29f8647eb59e56207f")
}
> db.demo329.insertOne({"Name":"David","Age":21,"Marks":89});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516f29f8647eb59e562080")
}
登録したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。見やすさのためにpretty()を付けて実行します。
> db.demo329.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e516f28f8647eb59e56207d"),
"Name" : "Chris",
"Age" : 21,
"Marks" : 45
}
{
"_id" : ObjectId("5e516f28f8647eb59e56207e"),
"Name" : "David",
"Age" : 21,
"Marks" : 56
}
{
"_id" : ObjectId("5e516f29f8647eb59e56207f"),
"Name" : "Mike",
"Age" : 21,
"Marks" : 78
}
{
"_id" : ObjectId("5e516f29f8647eb59e562080"),
"Name" : "David",
"Age" : 21,
"Marks" : 89
}
キー値を合計する集計クエリ
それでは本題の合計クエリです。aggregate()の中で、まず$matchによって「NameがDavid」かつ「Ageが21」のドキュメントだけを絞り込みます。その後、$groupステージで_idをnullに設定し、$sum演算子を使って「Marks」フィールドの合計値を算出します。
> db.demo329.aggregate([
... {
... $match: {
... $and: [
... { 'Name': 'David'},
... { Age:21}
... ]
... }
... },
... {
... $group: {
... _id: null,
... TotalMarks: { $sum: "$Marks" }
... }
... }
... ])
実行結果
上記のクエリを実行すると、条件に一致したドキュメント(David・Age 21の2件:56点と89点)の合計が出力されます。
{ "_id" : null, "TotalMarks" : 145 }
このように、$matchで対象を絞り込み、$groupと$sumで集計する流れを覚えておけば、売上合計やアクセス数の集計など、さまざまな場面で応用できます。なお、条件が単純な場合は$andを省略して{ Name: 'David', Age: 21 }のように直接指定することも可能です。
-
MongoDBで特定の値より大きい配列要素を持つドキュメントを照会する方法($elemMatch活用)
MongoDBで配列内の値を条件に照合するにはMongoDBでは、$elemMatch 演算子を使用することで、指定したすべてのクエリ条件に一致する要素が少なくとも1つ含まれる配列フィールドを持つドキュメントを照合できます。ここでは、配列内の値が特定の値より大きいドキュメントを検索する方法を、具体的なサンプルコードとともに解説します。1. サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。> db.demo701.insertOne({ListOfValues:[100,200,300]}); { acknowledged : true, ins
-
MongoDBで特定の文字列を使ってフィールドのすべての値を一括更新する方法
MongoDBでフィールドのすべての値を一括更新する方法MongoDBのコレクション内に存在するすべてのドキュメントの特定フィールドを、同じ文字列でまとめて更新したい場合があります。そのようなときは、update()メソッドにオプション「multi: true」を指定します。この記事では、実際のコマンド例をもとに、手順をわかりやすく解説します。1. サンプルコレクションの作成まずはinsertOne()メソッドを使って、テスト用コレクション「demo720」に複数のドキュメントを挿入します。> db.demo720.insertOne({SubjectName:MySQL}); {