MongoDBのAggregateでドキュメントと配列要素の平均値を取得する方法
MongoDBでドキュメントのフィールドおよび配列内の各要素の平均値を求めるには、aggregate()メソッドと$groupステージを組み合わせ、平均を計算する$avg演算子を使用します。ここでは、実際にサンプルコレクションを作成しながら、具体的な手順を解説します。
サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。
> db.demo598.insertOne(
... {
... Information:'Student',
... id:100,
... details:[
... {Name:'Chris',Marks:75},
... {Name:'Bob',Marks:55}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e947fccf5f1e70e134e2694")
}
> db.demo598.insertOne(
... {
... Information:'Student',
... id:101,
... details:[
... {Name:'Chris',Marks:75},
... {Name:'Bob',Marks:45}
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e947fcdf5f1e70e134e2695")
}
登録したドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.demo598.find();
上記のコマンドを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e947fccf5f1e70e134e2694"), "Information" : "Student", "id" : 100, "details" : [
{ "Name" : "Chris", "Marks" : 75 },
{ "Name" : "Bob", "Marks" : 55 }
] }
{ "_id" : ObjectId("5e947fcdf5f1e70e134e2695"), "Information" : "Student", "id" : 101, "details" : [
{ "Name" : "Chris", "Marks" : 75 },
{ "Name" : "Bob", "Marks" : 45 }
] }
ドキュメントと配列要素の平均を取得するクエリ
以下は、ドキュメントのフィールド(id)と、details配列内の各要素(Marks)それぞれの平均値を取得するための集計クエリです。
> db.demo598.aggregate([
...
... { "$group": {
... "_id": "Information",
... "id": { "$avg": "$id" },
... "details": { "$push": "$details" }
... }},
... { "$unwind": "$details" },
... { "$unwind": "$details" },
... { "$group": {
... "_id": { "Information": "$_id", "Name": "$details.Name" },
... "id": { "$avg": "$id" },
... "AvgValue": { "$avg": "$details.Marks" }
... }},
... { "$sort": { "_id": 1 } },
... { "$group": {
... "_id": "$_id.Information",
... "id": { "$avg": "$id" },
... "details": { "$push": {
... "Name": "$_id.Name",
... "MarksAvg": "$AvgValue"
... }}
... }}
... ]).pretty();
パイプラインの処理内容
- $group(1回目):Informationフィールドをキーにグループ化し、idの平均値を計算するとともに、details配列をまとめます。
- $unwind(2回):ネストされたdetails配列を段階的に展開し、個々の要素(NameとMarks)を扱えるようにします。
- $group(2回目):InformationとNameの組み合わせごとにグループ化し、idの平均と、各NameにおけるMarksの平均(AvgValue)を算出します。
- $sort:結果を_id順に並べ替えます。
- $group(3回目):Information単位で再度グループ化し、名前ごとの平均点をdetails配列として再構成します。
実行結果
このクエリを実行すると、次のような結果が出力されます。
{
"_id" : "Information",
"id" : 100.5,
"details" : [
{
"Name" : "Bob",
"MarksAvg" : 50
},
{
"Name" : "Chris",
"MarksAvg" : 75
}
]
}
このように、idの平均は100.5、BobのMarks平均は50、ChrisのMarks平均は75として正しく集計されています。$groupと$unwindを組み合わせることで、ネストされた配列データも柔軟に集計できるのがポイントです。
-
MongoDBで配列要素の平均値を取得するクエリの書き方
MongoDBで配列内の数値の平均を求める方法MongoDBでは、配列に格納された複数の数値から平均値を算出したいケースがよくあります。例えば、1つのドキュメントの中に複数の点数(Marks)が配列として保存されている場合、その平均点を取得したいことがあります。このような場合、集計パイプライン(aggregation)と$avg演算子を組み合わせることで、簡単に平均値を求めることができます。$avgは、指定したフィールド(配列の場合はその全要素)の数値の平均を自動的に計算してくれる便利な演算子です。以下、具体的な手順を見ていきましょう。1. コレクションを作成し、ドキュメントを挿入するまず、i
-
MongoDBで特定フィールドの配列要素数を取得する方法($size演算子の使い方)
MongoDBでドキュメント内の特定フィールド(配列)に含まれる要素の数をカウントしたい場合は、集計パイプライン(aggregate)と$size演算子を組み合わせるのが最も簡単な方法です。この記事では、実際のコレクションを作成しながら、配列要素数を取得する具体的な手順を解説します。1. サンプルコレクションの作成まず、配列型のフィールド「Subject」を持つドキュメントを含むコレクションを作成します。> db.demo723.insertOne({Subject:[MySQL,MongoDB]}); { acknowledged : true, insertedId