점수를 합산하려면 aggregate() 메서드와 함께 $sum 연산자를 사용하면 됩니다. 먼저 예제에 사용할 컬렉션을 생성하고 문서를 삽입해 보겠습니다.
> db.demo434.insertOne({"Name":"Chris","Score":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e771603bbc41e36cc3cae93")
}
> db.demo434.insertOne({"Name":"David","Score":55});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e77161abbc41e36cc3cae94")
}
> db.demo434.insertOne({"Name":"Chris","Score":55});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e771624bbc41e36cc3cae95")
}find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo434.find();
위 명령은 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e771603bbc41e36cc3cae93"), "Name" : "Chris", "Score" : 45 }
{ "_id" : ObjectId("5e77161abbc41e36cc3cae94"), "Name" : "David", "Score" : 55 }
{ "_id" : ObjectId("5e771624bbc41e36cc3cae95"), "Name" : "Chris", "Score" : 55 }특정 학생의 점수 합산 쿼리
다음은 이름이 "Chris"인 학생의 점수를 합산하는 집계 쿼리입니다.
> db.demo434.aggregate([
... { "$match": { "Name": "Chris"} },
... { "$group": { "_id": null, "TotalScore": { "$sum": "$Score" } } }
... ]);실행 결과는 다음과 같습니다.
{ "_id" : null, "TotalScore" : 100 }쿼리 동작 방식
이 집계 파이프라인은 두 단계로 구성되어 있습니다.
1. $match 단계: 조건에 일치하는 문서만 필터링합니다. 여기서는 Name 필드가 "Chris"인 문서만 다음 단계로 전달되며, 나머지 문서(예: David)는 제외됩니다.
2. $group 단계: _id를 null로 지정하면 필터링된 모든 문서가 하나의 그룹으로 묶입니다. 이때 $sum 연산자가 각 문서의 Score 값을 누적하여 합계를 계산하고, 그 결과를 TotalScore라는 새로운 필드에 저장합니다.
결과적으로 Chris의 점수 45점과 55점이 합산되어 총점 100점이 출력되는 것을 확인할 수 있습니다. 이처럼 $match와 $group, $sum을 조합하면 특정 조건에 해당하는 데이터의 합계를 손쉽게 구할 수 있습니다.