MongoDBでnullによるグループ化を使ってドキュメントの平均値を計算する方法
MongoDBでは、$group演算子の_idにnullを指定することで、コレクション全体をひとつのグループとして扱い、平均値を計算できます。特定のフィールドでグループ分けせず、全ドキュメントの集計結果が欲しい場合に便利な手法です。
基本構文
平均値を計算するための基本的な構文は以下のとおりです。
db.yourCollectionName.aggregate([{$group: {_id:null, "anyFieldName": {$avg:"$yourFieldName"} } }]);$avg演算子を使うことで、指定したフィールドの数値の平均を求められます。_id: nullとすることで、すべてのドキュメントが単一のグループにまとめられます。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成してみましょう。
> db.caculateTheAverageValueDemo.insertOne({"Population":100});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd68a197924bb85b3f4895f")
}
> db.caculateTheAverageValueDemo.insertOne({"Population":500});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd68a1c7924bb85b3f48960")
}
> db.caculateTheAverageValueDemo.insertOne({"Population":200});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd68a237924bb85b3f48961")
}
> db.caculateTheAverageValueDemo.insertOne({"Population":100});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd68a297924bb85b3f48962")
}
> db.caculateTheAverageValueDemo.insertOne({"Population":100});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd68a2e7924bb85b3f48963")
}登録したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.caculateTheAverageValueDemo.find().pretty();
このクエリを実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5cd68a197924bb85b3f4895f"), "Population" : 100 }
{ "_id" : ObjectId("5cd68a1c7924bb85b3f48960"), "Population" : 500 }
{ "_id" : ObjectId("5cd68a237924bb85b3f48961"), "Population" : 200 }
{ "_id" : ObjectId("5cd68a297924bb85b3f48962"), "Population" : 100 }
{ "_id" : ObjectId("5cd68a2e7924bb85b3f48963"), "Population" : 100 }平均値を計算するクエリ
それでは、aggregate()メソッドと$group演算子を組み合わせて、Populationフィールドの平均値を計算してみましょう。
> db.caculateTheAverageValueDemo.aggregate([{$group: {_id:null, "AveragePopulation": {$avg:"$Population"} } }]);実行結果は以下のとおりです。
{ "_id" : null, "AveragePopulation" : 200 }結果の解説
この例では、5つのドキュメント(100、500、200、100、100)の合計は1000なので、平均値は1000 ÷ 5 = 200となります。_idがnullになっているのは、_id: nullを指定して全ドキュメントをひとつのグループにまとめたためです。
この手法は、コレクション全体の統計情報(平均、合計、最大値、最小値など)を一度に取得したい場合に広く活用できます。たとえば$avgを$sumや$maxに置き換えるだけで、さまざまな集計処理に応用可能です。
-
MongoDBでドキュメントの値を1つだけインクリメントする方法
MongoDBでドキュメント内の特定の値だけを更新し、インクリメント(加算)したい場合は、update()メソッドと$inc演算子を組み合わせて使用します。$incは指定したフィールドの数値を増減させるための演算子で、他のフィールドに影響を与えることなくピンポイントで値を変更できるのが特徴です。サンプルコレクションの作成まず、ドキュメントを格納したコレクションを作成します。> db.demo698.insertOne({Score:78});{ "acknowledged" : true, "insertedI
-
【MongoDB】ネストされた(入れ子構造の)ドキュメントを更新するクエリの書き方
MongoDBでは、入れ子(ネスト)になったサブドキュメントのフィールドを更新する際、update()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記を使うことで、深い階層にあるフィールドを直接指定して値を変更できます。1. サンプルコレクションの作成まず、ネストされたドキュメントを含むコレクションを作成しましょう。以下のコマンドでdemo607というコレクションにドキュメントを挿入します。> db.demo607.insertOne( ... { ... id: 1, ... Info1 : { ...