MongoDB에서 평균값보다 큰 값을 가진 문서를 선택하려면 aggregate() 메서드를 사용하고, 평균을 계산할 때는 $avg 연산자를 활용하면 됩니다.
1. 컬렉션 생성 및 문서 삽입
먼저 데모용 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo552.insertOne({values:10});{
"acknowledged" : true, "insertedId" : ObjectId("5e8e3b1c9e5f92834d7f05ea")
}
> db.demo552.insertOne({values:50});{
"acknowledged" : true, "insertedId" : ObjectId("5e8e3b1f9e5f92834d7f05eb")
}
> db.demo552.insertOne({values:40});{
"acknowledged" : true, "insertedId" : ObjectId("5e8e3b289e5f92834d7f05ec")
}2. 전체 문서 확인하기
find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 조회합니다.
> db.demo552.find();
위 쿼리는 다음과 같은 출력 결과를 반환합니다.
{ "_id" : ObjectId("5e8e3b1c9e5f92834d7f05ea"), "values" : 10 }
{ "_id" : ObjectId("5e8e3b1f9e5f92834d7f05eb"), "values" : 50 }
{ "_id" : ObjectId("5e8e3b289e5f92834d7f05ec"), "values" : 40 }3. 평균보다 높은 값을 가진 문서 선택하기
평균보다 큰 값을 가진 문서를 선택하는 쿼리는 다음과 같습니다. 먼저 $group과 $avg를 조합한 애그리게이션으로 평균값을 구한 뒤, 그 값을 변수에 저장하고 $gt(보다 큰) 연산자와 함께 find() 쿼리에 적용합니다.
> var findAvg = db.demo552.aggregate([
... { "$group": { "_id": "null", Average: { "$avg": "$values"} }}
... ]).toArray()[0]["Average"];
> db.demo552.find({ "values": { "$gt": findAvg } })실행 결과
{ "_id" : ObjectId("5e8e3b1f9e5f92834d7f05eb"), "values" : 50 }
{ "_id" : ObjectId("5e8e3b289e5f92834d7f05ec"), "values" : 40 }쿼리 동작 원리
이 예제에서 세 문서의 values 값은 각각 10, 50, 40이므로 전체 평균은 (10 + 50 + 40) / 3 = 33.33입니다. 따라서 values가 33.33보다 큰 두 문서(50과 40)만 최종 결과로 반환됩니다.
핵심 포인트를 정리하면 다음과 같습니다.
- $group: _id를 null로 지정하여 컬렉션 전체를 하나의 그룹으로 묶습니다.
- $avg: 그룹 내 values 필드의 평균값을 계산합니다.
- toArray()[0]["Average"]: 애그리게이션 결과 배열에서 평균값만 추출하여 자바스크립트 변수에 저장합니다.
- $gt: 저장된 평균값보다 큰 값을 가진 문서만 필터링합니다.
이처럼 애그리게이션으로 계산한 평균값을 변수에 담아 find() 쿼리의 조건으로 활용하면, MongoDB에서도 손쉽게 평균 이상(초과) 데이터를 조회할 수 있습니다.