개요
MongoDB에서 여러 키를 기준으로 집계를 수행하려면 aggregate() 메서드와 함께 $group 연산자를 사용하면 됩니다. $group 단계의 _id 필드에 여러 개의 키를 객체 형태로 지정하면, 해당 키들의 조합을 기준으로 문서들이 그룹화됩니다.
이번 글에서는 실제 예제를 통해 여러 키를 사용한 집계 과정을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 demo190이라는 컬렉션에 문서를 삽입해 보겠습니다.
> db.demo190.insertOne(
... {
... "DueDate" : ISODate("2020-01-01"),
... "Value" : 10,
... "Name" : "Chris"
... }
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3ad76403d395bdc21346bf")
}
>
> db.demo190.insertOne(
... {
... "DueDate" : ISODate("2020-02-05"),
... "Value" : 30,
... "Name" : "David"
... }
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3ad76403d395bdc21346c0")
}
> db.demo190.insertOne(
... {
... "DueDate" : ISODate("2020-01-01"),
... "Value" : 40,
... "Name" : "Chris"
... }
...);
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3ad7f003d395bdc21346c1")
}2. 저장된 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo190.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e3ad76403d395bdc21346bf"), "DueDate" : ISODate("2020-01-01T00:00:00Z"), "Value" : 10, "Name" : "Chris" }
{ "_id" : ObjectId("5e3ad76403d395bdc21346c0"), "DueDate" : ISODate("2020-02-05T00:00:00Z"), "Value" : 30, "Name" : "David" }
{ "_id" : ObjectId("5e3ad7f003d395bdc21346c1"), "DueDate" : ISODate("2020-01-01T00:00:00Z"), "Value" : 40, "Name" : "Chris" }3. 여러 키로 집계 수행하기
이제 Name과 DueDate(연도)라는 두 개의 키를 기준으로 그룹화하고, 각 그룹의 Value 합계를 구하는 집계 쿼리를 실행해 보겠습니다.
> db.demo190.aggregate(
... [
... {
... "$group": {
... "_id": {
... "Name": "$Name",
... "DueDate": { "$year": "$DueDate" }
... },
... "Value": { "$sum": "$Value" }
... }
... }
... ],
... function(err, results) {
... console.log(results);
... }
... );여기서 핵심은 _id 필드 안에 두 개의 키를 지정했다는 점입니다.
- Name: "$Name" — 각 문서의 이름 값을 그룹화 기준으로 사용합니다.
- DueDate: { "$year": "$DueDate" } — $year 연산자를 사용해 날짜 값에서 연도만 추출한 뒤 그룹화 기준으로 사용합니다.
- Value: { "$sum": "$Value" } — 같은 그룹에 속한 문서들의 Value 값을 모두 더합니다.
위 집계 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : { "Name" : "David", "DueDate" : 2020 }, "Value" : 30 }
{ "_id" : { "Name" : "Chris", "DueDate" : 2020 }, "Value" : 50 }결과 분석
출력 결과를 보면 Chris의 경우 Value가 10과 40인 두 개의 문서가 하나의 그룹으로 합쳐져 합계 50이 계산된 것을 확인할 수 있습니다. David는 문서가 하나뿐이므로 그대로 30이 출력됩니다. 이처럼 _id에 여러 키를 조합해 지정하면 복합 조건 기반의 그룹화 및 집계를 손쉽게 구현할 수 있습니다.