집계(Aggregation) 연산은 여러 문서의 값을 하나로 묶어(group) 처리한 뒤, 그룹화된 데이터에 다양한 연산을 적용하여 단일 결과를 반환하는 기능입니다.
MongoDB에서 집계를 수행하려면 aggregate() 메서드를 사용합니다. 먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
1. 샘플 컬렉션 생성
insertOne() 메서드를 사용해 demo620 컬렉션에 문서를 삽입합니다.
> db.demo620.insertOne({"Country":"IND","City":"Delhi",state:"Delhi"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9a8de96c954c74be91e6a1")
}
> db.demo620.insertOne({"Country":"IND","City":"Bangalore",state:"Karnataka"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9a8e336c954c74be91e6a3")
}
> db.demo620.insertOne({"Country":"IND","City":"Mumbai",state:"Maharashtra"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9a8e636c954c74be91e6a4")
}2. 저장된 문서 확인
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.demo620.find();
위 쿼리는 다음과 같은 출력을 반환합니다.
{ "_id" : ObjectId("5e9a8de96c954c74be91e6a1"), "Country" : "IND", "City" : "Delhi", "state" : "Delhi" }
{ "_id" : ObjectId("5e9a8e336c954c74be91e6a3"), "Country" : "IND", "City" : "Bangalore", "state" : "Karnataka" }
{ "_id" : ObjectId("5e9a8e636c954c74be91e6a4"), "Country" : "IND", "City" : "Mumbai", "state" : "Maharashtra" }3. 국가, 주, 도시별 집계 쿼리
다음은 국가(Country), 주(state), 도시(City) 기준으로 데이터를 그룹화하는 집계 쿼리입니다. 첫 번째 $group 단계에서 국가와 주를 기준으로 묶고, $addToSet 연산자로 해당 지역의 도시 목록을 중복 없이 수집합니다. 이후 두 번째 $group 단계에서 국가별로 주와 도시 정보를 다시 묶어 계층적인 구조를 만듭니다.
> db.demo620.aggregate([
... { "$group": {
... "_id": {
... "Country": "$Country",
... "state": "$state"
... },
... "City": {
... "$addToSet": {
... "City": "$City"
... }
... }
... }},
... { "$group": {
... "_id": "$_id.Country",
... "states": {
... "$addToSet": {
... "state": "$_id.state",
... "City": "$City"
... }
... }
... }}
... ]).pretty();4. 실행 결과
위 집계 쿼리를 실행하면 다음과 같이 국가 → 주 → 도시 순으로 중첩된 구조의 결과를 얻을 수 있습니다.
{
"_id" : "IND",
"states" : [
{
"state" : "Delhi",
"City" : [
{
"City" : "Delhi"
}
]
},
{
"state" : "Maharashtra",
"City" : [
{
"City" : "Mumbai"
}
]
},
{
"state" : "Karnataka",
"City" : [
{
"City" : "Bangalore"
}
]
}
]
}이처럼 MongoDB의 애그리게이션 파이프라인을 활용하면 평탄하게 저장된 문서들을 국가, 주, 도시의 계층 구조로 손쉽게 재구성할 수 있습니다. $addToSet은 배열 내 중복 값을 자동으로 제거해 주므로, 동일한 도시나 주가 여러 번 등록되어 있더라도 깔끔한 결과를 얻을 수 있다는 점도 유용합니다.