MongoDB에서 문서 필드와 배열 내부 요소의 평균값을 한 번에 계산해야 하는 경우가 있습니다. 이럴 때는 $avg 연산자를 $group 단계와 함께 aggregate() 메서드 안에서 사용하면 됩니다.
1. 샘플 컬렉션 생성하기
먼저 실습용 컬렉션을 만들고 문서를 삽입하겠습니다. 각 문서는 학생 정보와 이름·점수를 담은 details 배열을 포함하고 있습니다.
> 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")
}2. 저장된 문서 확인하기
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 }
] }3. 집계 파이프라인으로 평균값 계산하기
이제 문서의 id 필드 평균과 배열 요소별 점수(Marks) 평균을 동시에 구하는 쿼리입니다. 핵심 흐름은 다음과 같습니다.
- $group: Information 기준으로 그룹화하고 id 평균과 details 배열을 모읍니다.
- $unwind: 중첩된 details 배열을 개별 문서로 펼칩니다(두 번 적용).
- $group: 이름(Name)별로 다시 그룹화하여 점수 평균($avg)을 계산합니다.
- $sort: 결과를 정렬한 뒤 최종 형태로 재구성합니다.
> 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();4. 실행 결과
위 집계 쿼리를 실행하면 다음과 같은 출력 결과가 나타납니다.
{
"_id" : "Information",
"id" : 100.5,
"details" : [
{
"Name" : "Bob",
"MarksAvg" : 50
},
{
"Name" : "Chris",
"MarksAvg" : 75
}
]
}결과를 살펴보면 id 필드의 평균은 100.5((100 + 101) / 2)로 계산되었고, Bob의 점수 평균은 50((55 + 45) / 2), Chris의 점수 평균은 75((75 + 75) / 2)로 정확하게 산출된 것을 확인할 수 있습니다.
이처럼 MongoDB의 집계 프레임워크를 활용하면 문서 수준의 값과 배열 내부 요소의 값을 함께 그룹화하여 손쉽게 통계를 낼 수 있습니다.