MongoDB에서 중복 ID를 기준으로 평점 평균 구하는 방법
MongoDB에서 평균값을 계산하려면 집계 파이프라인(Aggregation Pipeline)의 $avg 연산자를 사용해야 합니다. 이 글에서는 동일한 id가 여러 개 존재하는 문서들을 대상으로, id별 평점(rating) 평균을 구하는 과정을 단계별로 살펴봅니다. 특히 rating 값이 null인 문서가 섞여 있을 때 $ifNull 연산자로 이를 처리하는 방법도 함께 다룹니다.
1단계: 샘플 컬렉션 생성 및 문서 삽입
먼저 demo606이라는 컬렉션을 만들고 문서를 삽입합니다. 아래 예제에는 id가 1과 2인 문서들이 중복되어 있으며, 일부 문서는 rating 값이 null입니다.
> db.demo606.insertOne({id:1,rating:5});{ "acknowledged" : true, "insertedId" : ObjectId("5e972dfbf57d0dc0b182d623") }> db.demo606.insertOne({id:1,rating:4});{ "acknowledged" : true, "insertedId" : ObjectId("5e972dfef57d0dc0b182d624") }> db.demo606.insertOne({id:2,rating:3});{ "acknowledged" : true, "insertedId" : ObjectId("5e972e09f57d0dc0b182d625") }> db.demo606.insertOne({id:1,rating:null});{ "acknowledged" : true, "insertedId" : ObjectId("5e972e0ef57d0dc0b182d626") }> db.demo606.insertOne({id:2,rating:null});{ "acknowledged" : true, "insertedId" : ObjectId("5e972e15f57d0dc0b182d627") }> db.demo606.insertOne({id:2,rating:3});{ "acknowledged" : true, "insertedId" : ObjectId("5e972e1bf57d0dc0b182d628") }2단계: find()로 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo606.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : ObjectId("5e972dfbf57d0dc0b182d623"), "id" : 1, "rating" : 5 }{ "_id" : ObjectId("5e972dfef57d0dc0b182d624"), "id" : 1, "rating" : 4 }{ "_id" : ObjectId("5e972e09f57d0dc0b182d625"), "id" : 2, "rating" : 3 }{ "_id" : ObjectId("5e972e0ef57d0dc0b182d626"), "id" : 1, "rating" : null }{ "_id" : ObjectId("5e972e15f57d0dc0b182d627"), "id" : 2, "rating" : null }{ "_id" : ObjectId("5e972e1bf57d0dc0b182d628"), "id" : 2, "rating" : 3 }3단계: $group과 $avg로 id별 평점 평균 계산하기
중복된 id를 기준으로 평점 평균을 구하려면 aggregate() 메서드 안에서 $group 단계를 사용합니다. _id를 "$id"로 지정하면 id 값이 같은 문서들이 하나의 그룹으로 묶이고, $avg 연산자가 각 그룹의 rating 평균을 자동으로 계산해 줍니다.
> db.demo606.aggregate(... [... { "$group": {... "_id": "$id",... "AverageRating": { "$avg": { "$ifNull": ["$rating",0 ] } }... }}... ]... );여기서 핵심은 $ifNull입니다. 원래 $avg는 null 값을 평균 계산에서 제외하기 때문에, null을 0으로 취급해 평균에 포함시키고 싶다면 "$ifNull": ["$rating", 0] 형태로 작성하면 됩니다. 이렇게 하면 rating이 null인 문서도 0점으로 간주되어 평균 산정에 반영됩니다.
실행 결과 및 해석
집계 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : 2, "AverageRating" : 2 }{ "_id" : 1, "AverageRating" : 3 }결과를 해석해 보면 다음과 같습니다. id가 1인 그룹은 평점이 5, 4, null(0 처리)로 세 개이므로 (5 + 4 + 0) ÷ 3 = 3이 되고, id가 2인 그룹은 3, null(0 처리), 3이므로 (3 + 0 + 3) ÷ 3 = 2가 됩니다.
정리
MongoDB에서 중복된 키를 기준으로 평균을 구할 때는 $group으로 데이터를 묶고 $avg로 평균을 계산하는 것이 기본 패턴입니다. 여기에 $ifNull을 조합하면 null 값이 있는 문서도 원하는 방식(0으로 처리 또는 제외)으로 유연하게 다룰 수 있습니다. 실무에서 리뷰 점수 집계, 통계 대시보드 등을 개발할 때 자주 사용되는 패턴이니 꼭 익혀두시길 권장합니다.