MongoDB에서 배열(array)에 저장된 여러 값들의 평균을 계산해야 하는 경우가 자주 있습니다. 예를 들어 학생의 과목별 점수가 배열로 저장되어 있을 때 전체 평균 점수를 구하고 싶다면, 집계 파이프라인(aggregation pipeline)에서 $avg 연산자를 사용하면 됩니다.
테스트용 컬렉션 생성하기
먼저 실습을 위해 문서(document)를 포함한 컬렉션을 생성해 보겠습니다. insertOne() 메서드를 사용하여 점수 배열을 저장합니다.
> db.demo584.insertOne({"Marks":[75,50,85,60,80]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e91d827fd2d90c177b5bcc2")
}저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다. pretty()를 함께 사용하면 결과를 보기 좋게 정렬된 형태로 출력할 수 있습니다.
> db.demo584.find().pretty();
위 쿼리를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
{
"_id" : ObjectId("5e91d827fd2d90c177b5bcc2"),
"Marks" : [
75,
50,
85,
60,
80
]
}$avg 연산자로 배열 요소의 평균 구하기
배열 요소들의 평균값을 계산하려면 aggregate() 메서드와 함께 $project 단계 안에서 $avg 연산자를 사용합니다. 아래 쿼리는 Marks 배열의 모든 요소에 대한 평균을 MarksAvg라는 새 필드로 출력합니다.
> db.demo584.aggregate([
... { $project: { MarksAvg: { $avg: "$Marks"} } }
... ])실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e91d827fd2d90c177b5bcc2"), "MarksAvg" : 70 }결과 해석
배열에 저장된 점수는 75, 50, 85, 60, 80이며, 이 값들의 합은 350입니다. 따라서 평균은 350 ÷ 5 = 70으로 계산됩니다. 이처럼 $avg 연산자는 배열 내 숫자 요소들을 자동으로 인식하여 평균값을 손쉽게 반환해 줍니다.
참고로 $avg 연산자는 숫자가 아닌 값(문자열 등)은 무시하고 계산하며, 배열에 유효한 숫자 값이 하나도 없으면 결과로 null을 반환한다는 점도 기억해 두면 좋습니다.