MongoDB에서 특정 조건을 만족하는 문서들의 키 값을 합산하려면 aggregate() 메서드와 함께 $match 연산자를 사용하면 됩니다. 이 글에서는 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 데모용 컬렉션을 만들고 문서를 삽입해 보겠습니다. insertOne() 메서드를 사용하여 네 개의 문서를 추가합니다.
> db.demo329.insertOne({"Name":"Chris","Age":21,"Marks":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516f28f8647eb59e56207d")
}
> db.demo329.insertOne({"Name":"David","Age":21,"Marks":56});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516f28f8647eb59e56207e")
}
> db.demo329.insertOne({"Name":"Mike","Age":21,"Marks":78});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516f29f8647eb59e56207f")
}
> db.demo329.insertOne({"Name":"David","Age":21,"Marks":89});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e516f29f8647eb59e562080")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo329.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e516f28f8647eb59e56207d"),
"Name" : "Chris",
"Age" : 21,
"Marks" : 45
}
{
"_id" : ObjectId("5e516f28f8647eb59e56207e"),
"Name" : "David",
"Age" : 21,
"Marks" : 56
}
{
"_id" : ObjectId("5e516f29f8647eb59e56207f"),
"Name" : "Mike",
"Age" : 21,
"Marks" : 78
}
{
"_id" : ObjectId("5e516f29f8647eb59e562080"),
"Name" : "David",
"Age" : 21,
"Marks" : 89
}3. 키 값 합산 쿼리 작성하기
이제 특정 키 값을 합산하는 쿼리를 작성해 보겠습니다. 여기서는 이름이 'David'이면서 나이가 21살인 문서의 Marks(점수) 합계를 구합니다.
쿼리의 동작 방식은 다음과 같습니다.
- $match: 조건에 맞는 문서만 필터링합니다. 이 예제에서는 $and 연산자를 사용해 두 조건(Name이 'David', Age가 21)을 모두 만족하는 문서를 선택합니다.
- $group: 필터링된 문서들을 그룹화합니다.
_id: null로 지정하면 전체 문서를 하나의 그룹으로 묶습니다. - $sum: 그룹 내 각 문서의 Marks 필드 값을 모두 더합니다.
> db.demo329.aggregate([
... {
... $match: {
... $and: [
... { 'Name': 'David'},
... { Age:21}
... ]
... }
... },
... {
... $group: {
... _id: null,
... TotalMarks: { $sum: "$Marks" }
... }
... }
... ])4. 실행 결과
위 집계 파이프라인을 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : null, "TotalMarks" : 145 }David의 점수는 56점과 89점으로, 두 값을 합하면 정확히 145가 나옵니다. Chris(45점)와 Mike(78점)의 문서는 조건에 맞지 않아 제외된 것을 확인할 수 있습니다.
마무리
이처럼 MongoDB에서는 $match로 원하는 문서를 먼저 걸러낸 뒤, $group과 $sum을 조합하면 손쉽게 특정 키 값의 합계를 계산할 수 있습니다. 조건이 하나뿐이라면 $and 없이 { Name: 'David' } 형태로 간결하게 작성할 수도 있습니다. 이 패턴은 매출 합계, 주문 수량 집계 등 다양한 데이터 분석 작업에 응용할 수 있으니 꼭 기억해 두세요.