MongoDB에서 정렬을 활용해 문서별 평균값 계산하기
MongoDB에서 각 문서의 배열 필드에 담긴 값들의 평균을 구하려면 aggregate 집계 파이프라인과 $avg 연산자를 함께 사용하면 됩니다. 여기에 $addFields 스테이지로 계산된 평균값을 새 필드로 추가한 뒤, $sort 스테이지를 이용해 원하는 기준으로 정렬할 수 있습니다.
먼저 예제에 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
> db.calculateAverage.insertOne({'Value':[10,20,80]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0383e3f5e889d7a51994dc")
}
> db.calculateAverage.insertOne({'Value':[12,15,16]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0383edf5e889d7a51994dd")
}
> db.calculateAverage.insertOne({'Value':[30,35,40]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0383f5f5e889d7a51994de")
}find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.calculateAverage.find().pretty();
위 명령은 다음과 같은 출력을 반환합니다.
{
"_id" : ObjectId("5e0383e3f5e889d7a51994dc"),
"Value" : [
10,
20,
80
]
}
{
"_id" : ObjectId("5e0383edf5e889d7a51994dd"),
"Value" : [
12,
15,
16
]
}
{
"_id" : ObjectId("5e0383f5f5e889d7a51994de"),
"Value" : [
30,
35,
40
]
}이제 정렬과 함께 각 문서의 평균값을 계산하는 쿼리입니다.
> db.calculateAverage.aggregate([ { "$addFields": { "calavg": { "$avg": "$Value" } }}, { "$sort": { "calavg": 1 } } ],function(err, out) { res.send(out) });위 쿼리는 다음과 같이 동작합니다.
- $addFields: Value 배열의 평균을 계산해 새로운 필드인 calavg에 저장합니다.
- $sort: calavg 값을 기준으로 문서를 오름차순(1)으로 정렬합니다.
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e0383edf5e889d7a51994dd"), "Value" : [ 12, 15, 16 ], "calavg" : 14.333333333333334 }
{ "_id" : ObjectId("5e0383f5f5e889d7a51994de"), "Value" : [ 30, 35, 40 ], "calavg" : 35 }
{ "_id" : ObjectId("5e0383e3f5e889d7a51994dc"), "Value" : [ 10, 20, 80 ], "calavg" : 36.666666666666664 }출력 결과를 보면 각 문서에 calavg 필드가 추가되었고, 이 평균값을 기준으로 문서가 작은 순서대로 정렬된 것을 확인할 수 있습니다. 내림차순으로 정렬하고 싶다면 $sort의 값을 -1로 변경하면 됩니다.