MongoDB 집계로 평균 점수 구하기
MongoDB에서 저장된 수치 데이터의 평균값을 계산하려면 $avg 연산자를 집계(aggregate) 프레임워크와 함께 사용하면 됩니다. 이 글에서는 예제 컬렉션을 생성하고, find() 메서드로 문서를 확인한 뒤, $group 단계와 $avg 연산자를 조합해 평균 점수를 구하는 전체 과정을 단계별로 살펴봅니다.
1. 예제 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 문서가 담긴 컬렉션을 만듭니다. 여기서는 StudentDetails 객체 안에 StudentScore 필드가 포함된 구조를 사용합니다.
> db.averageReturiningNullDemo.insertOne(
{"StudentDetails" : { "StudentScore" : 89 }
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce9822e78f00858fb12e927")
}
> db.averageReturiningNullDemo.insertOne(
{"StudentDetails" : { "StudentScore" : 34 }
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce9822e78f00858fb12e928")
}
> db.averageReturiningNullDemo.insertOne(
{"StudentDetails" : { "StudentScore" : 78 }
});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ce9822e78f00858fb12e929")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있으며, pretty() 메서드를 함께 사용하면 결과를 보기 좋게 정렬해 출력합니다.
> db.averageReturiningNullDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{
"_id" : ObjectId("5ce9822e78f00858fb12e927"),
"StudentDetails" : {
"StudentScore" : 89
}
}
{
"_id" : ObjectId("5ce9822e78f00858fb12e928"),
"StudentDetails" : {
"StudentScore" : 34
}
}
{
"_id" : ObjectId("5ce9822e78f00858fb12e929"),
"StudentDetails" : {
"StudentScore" : 78
}
}3. $avg 연산자로 평균 점수 계산하기
평균값을 구하려면 aggregate() 메서드 안에서 $group 단계를 정의하고, _id를 null로 지정해 컬렉션의 모든 문서를 하나의 그룹으로 묶습니다. 그런 다음 $avg 연산자에 필드 경로("$StudentDetails.StudentScore")를 전달하면 해당 필드의 평균값이 계산됩니다.
> db.averageReturiningNullDemo.aggregate([
{
"$group": {
"_id": null,
"StudentScoreAverage": {
"$avg": "$StudentDetails.StudentScore"
}
}
}
]);쿼리를 실행하면 다음과 같이 세 문서의 평균 점수가 출력됩니다.
{ "_id" : null, "StudentScoreAverage" : 67 }결과 해석 및 참고 사항
(89 + 34 + 78) ÷ 3 = 67로, 세 학생 점수의 평균이 정확히 계산되었습니다. 실무에서 알아두면 유용한 특징은 다음과 같습니다.
- _id: null의 의미: 그룹화 기준을 null로 지정하면 모든 문서가 하나의 그룹으로 묶여 전체 평균이 계산됩니다. 반대로 학급별, 과목별 등 특정 기준으로 묶어 평균을 내고 싶다면 _id에 해당 필드를 지정하면 됩니다.
- null·누락 값 처리: $avg 연산자는 필드가 아예 없거나 null인 문서를 자동으로 제외하고 계산합니다. 따라서 일부 문서에 점수가 없더라도 오류 없이 나머지 문서만으로 평균을 구할 수 있습니다.
- 중첩 필드 경로: 위 예제처럼 도큐먼트 안에 객체가 중첩된 경우에도 "$StudentDetails.StudentScore" 형식의 점 표기법(dot notation)으로 손쉽게 필드에 접근할 수 있습니다.