MongoDB 집계와 그룹화 기본 개념
MongoDB에서 aggregate() 메서드와 함께 $group 연산자를 사용하면 컬렉션의 문서들을 특정 필드 기준으로 그룹화하고, 각 그룹의 문서 수를 손쉽게 집계할 수 있습니다.
이번 글에서는 실제 예제를 통해 컬렉션을 생성하고, 이름(Name) 필드를 기준으로 그룹화하여 각 이름이 몇 번 등장하는지 집계하는 방법을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 demo616 컬렉션에 문서를 생성합니다.
> db.demo616.insertOne({"details":{"Name":"Chris","Age":21}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99bfac65492f6c60d00283")
}
> db.demo616.insertOne({"details":{"Name":"Chris","Age":22}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99bfb065492f6c60d00284")
}
> db.demo616.insertOne({"details":{"Name":"Bob","Age":23}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99bfb865492f6c60d00285")
}
> db.demo616.insertOne({"details":{"Name":"Sam","Age":21}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99bfbd65492f6c60d00286")
}
> db.demo616.insertOne({"details":{"Name":"Chris","Age":24}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e99bfc165492f6c60d00287")
}위 코드는 총 5개의 문서를 삽입합니다. Chris가 3개, Bob과 Sam이 각각 1개씩 포함되어 있습니다.
2단계: find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.
> db.demo616.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e99bfac65492f6c60d00283"), "details" : { "Name" : "Chris", "Age" : 21 } }
{ "_id" : ObjectId("5e99bfb065492f6c60d00284"), "details" : { "Name" : "Chris", "Age" : 22 } }
{ "_id" : ObjectId("5e99bfb865492f6c60d00285"), "details" : { "Name" : "Bob", "Age" : 23 } }
{ "_id" : ObjectId("5e99bfbd65492f6c60d00286"), "details" : { "Name" : "Sam", "Age" : 21 } }
{ "_id" : ObjectId("5e99bfc165492f6c60d00287"), "details" : { "Name" : "Chris", "Age" : 24 } }3단계: $group으로 필드 개수 집계하기
이제 핵심인 집계 쿼리입니다. aggregate() 파이프라인 안에서 $group을 사용하고, _id에 그룹화 기준이 될 필드인 "$details.Name"을 지정합니다. 그리고 $sum: 1을 사용해 각 그룹에 속한 문서의 개수를 더합니다.
> db.demo616.aggregate(
... [
... {
... $group:{_id:"$details.Name",Total:{$sum:1}}}
... ]
... );실행 결과는 다음과 같습니다.
{ "_id" : "Sam", "Total" : 1 }
{ "_id" : "Bob", "Total" : 1 }
{ "_id" : "Chris", "Total" : 3 }결과 해석
출력 결과를 보면 details.Name 필드 값을 기준으로 문서들이 그룹화된 것을 확인할 수 있습니다.
- Chris: 총 3개의 문서가 해당됩니다.
- Bob: 총 1개의 문서가 해당됩니다.
- Sam: 총 1개의 문서가 해당됩니다.
이처럼 $group과 $sum 조합은 특정 필드 값의 빈도수를 계산할 때 매우 유용하게 활용됩니다. 나이(Age)나 다른 중첩 필드를 기준으로 그룹화하고 싶다면 _id 값만 "$details.Age" 등으로 변경하면 됩니다.