MongoDB에서는 $avg 연산자를 애그리게이션(aggregate) 프레임워크와 함께 사용하여 배열에 저장된 값들의 평균을 손쉽게 계산할 수 있습니다. 특히 $addFields 스테이지를 조합하면 계산된 평균값을 기존 문서에 새로운 필드로 추가할 수 있어 매우 유용합니다.
이 글에서는 학생 점수(StudentScore) 배열의 평균을 구하고, 그 결과를 원본 문서에 포함시키는 과정을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용하여 학생 정보 배열이 담긴 문서를 생성합니다.
> db.averageOfRatingsInArrayDemo.insertOne(
... {
... "StudentDetails":[
... {
... "StudentId":1,
... "StudentScore":45
... },
... {
... "StudentId":2,
... "StudentScore":58
... },
... {
... "StudentId":3,
... "StudentScore":67
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd427dc2cba06f46efe9ee4")
}2단계: 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.averageOfRatingsInArrayDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{
"_id" : ObjectId("5cd427dc2cba06f46efe9ee4"),
"StudentDetails" : [
{
"StudentId" : 1,
"StudentScore" : 45
},
{
"StudentId" : 2,
"StudentScore" : 58
},
{
"StudentId" : 3,
"StudentScore" : 67
}
]
}3단계: $addFields와 $avg로 평균 계산 후 필드 추가하기
이제 aggregate() 파이프라인 안에서 $addFields 스테이지와 $avg 연산자를 함께 사용하여 배열 내 점수의 평균을 계산하고, 그 결과를 원본 문서에 새로운 필드로 추가해 보겠습니다.
> db.averageOfRatingsInArrayDemo.aggregate([ {$addFields : {StudentScoreAverage : {$avg : "$StudentDetails.StudentScore"}}} ]);실행 결과는 다음과 같습니다. 기존 문서 뒤에 StudentScoreAverage라는 새로운 필드가 추가되고, 세 학생 점수(45, 58, 67)의 평균값이 자동으로 계산되어 저장된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5cd427dc2cba06f46efe9ee4"), "StudentDetails" : [ { "StudentId" : 1, "StudentScore" : 45 }, { "StudentId" : 2, "StudentScore" : 58 }, { "StudentId" : 3, "StudentScore" : 67 } ], "StudentScoreAverage" : 56.666666666666664 }정리
이처럼 MongoDB의 애그리게이션 프레임워크에서 $addFields와 $avg를 조합하면, 배열 요소들의 평균값을 계산하면서 동시에 원본 문서 구조를 그대로 유지한 채 결과 필드를 추가할 수 있습니다. 별도의 업데이트 작업 없이 조회 시점에 계산된 값을 함께 확인해야 하는 경우에 특히 유용한 패턴입니다.