MongoDB에서 특정 필드 값이 몇 번 등장하는지, 즉 레코드의 빈도(frequency)를 구하고 싶을 때가 있습니다. 이럴 때는 aggregate() 메서드와 $group 연산자를 함께 사용하면 간단하게 해결할 수 있습니다.
이 글에서는 이름(Name) 필드를 기준으로 그룹화하여 각 이름이 몇 개의 문서에 등장하는지 세어 보는 과정을 단계별로 살펴보겠습니다.
1. 컬렉션 및 문서 생성하기
먼저 실습에 사용할 컬렉션을 만들고 문서를 삽입하겠습니다. insertOne() 메서드를 사용해 여러 개의 문서를 순차적으로 추가합니다.
> db.demo232.insertOne({_id:101,Name:"Chris"});
{ "acknowledged" : true, "insertedId" : 101 }
> db.demo232.insertOne({_id:102,Name:"Bob"});
{ "acknowledged" : true, "insertedId" : 102 }
> db.demo232.insertOne({_id:103,Name:"Bob"});
{ "acknowledged" : true, "insertedId" : 103 }
> db.demo232.insertOne({_id:104,Name:"David"});
{ "acknowledged" : true, "insertedId" : 104 }
> db.demo232.insertOne({_id:105,Name:"Chris"});
{ "acknowledged" : true, "insertedId" : 105 }위 예제에서는 demo232라는 컬렉션에 Chris 2개, Bob 2개, David 1개로 총 5개의 문서를 저장했습니다.
2. 저장된 문서 전체 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo232.find();
이 명령은 다음과 같은 결과를 출력합니다.
{ "_id" : 101, "Name" : "Chris" }
{ "_id" : 102, "Name" : "Bob" }
{ "_id" : 103, "Name" : "Bob" }
{ "_id" : 104, "Name" : "David" }
{ "_id" : 105, "Name" : "Chris" }3. 이름별 빈도를 구하는 집계 쿼리
이제 핵심인 집계(aggregation) 쿼리입니다. $group 연산자로 Name 필드를 기준으로 문서를 묶고, $sum : 1을 사용해 각 그룹에 속한 문서의 개수를 더합니다.
> db.demo232.aggregate(
{ $group : {_id : "$Name", Frequency : { $sum : 1 }} }
);실행 결과는 다음과 같습니다.
{ "_id" : "David", "Frequency" : 1 }
{ "_id" : "Bob", "Frequency" : 2 }
{ "_id" : "Chris", "Frequency" : 2 }쿼리 동작 원리 이해하기
_id : "$Name": 그룹화 기준이 되는 키를 지정합니다. 여기서는$Name을 사용했기 때문에 이름 값이 같은 문서들이 하나의 그룹으로 묶입니다.Frequency : { $sum : 1 }: 그룹 내 문서마다 1씩 더하므로, 최종적으로 해당 이름이 등장한 횟수(빈도)가 계산됩니다.
결과를 보면 Bob과 Chris는 각각 2번, David는 1번 등장했음을 한눈에 확인할 수 있습니다. 이처럼 aggregate()와 $group 조합은 SQL의 GROUP BY와 COUNT()를 함께 사용한 것과 동일한 효과를 냅니다.
이 패턴은 이름뿐 아니라 카테고리, 상태, 지역 등 어떤 필드든 응용할 수 있으므로, 데이터 분석이나 통계 조회 시 매우 유용하게 활용됩니다.