MongoDB에서 집계(aggregate()) 파이프라인 내의 $group 연산자를 사용하면 지정된 _id 표현식을 기준으로 입력 문서들을 그룹화하고, 각 고유한 그룹마다 하나의 문서를 출력할 수 있습니다. 이번 글에서는 카운트 정보를 담는 새로운 필드와 함께 구조화된 형태로 결과를 조회하는 방법을 알아보겠습니다.
1. 샘플 컬렉션 생성 및 데이터 삽입
먼저 insertOne() 메서드를 사용해 컬렉션을 생성하고 문서를 삽입합니다.
> db.demo534.insertOne({_id:10,"ProductId":100,"ProductName":"Product-1"});
{ "acknowledged" : true, "insertedId" : 10 }
> db.demo534.insertOne({_id:11,"ProductId":100,"ProductName":"Product-2"});
{ "acknowledged" : true, "insertedId" : 11 }
> db.demo534.insertOne({_id:12,"ProductId":101,"ProductName":"Product-1"});
{ "acknowledged" : true, "insertedId" : 12 }2. 전체 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo534.find();
위 쿼리는 다음과 같은 출력 결과를 생성합니다.
{ "_id" : 10, "ProductId" : 100, "ProductName" : "Product-1" }
{ "_id" : 11, "ProductId" : 100, "ProductName" : "Product-2" }
{ "_id" : 12, "ProductId" : 101, "ProductName" : "Product-1" }3. 구조화된 그룹화 쿼리 작성하기
다음은 MongoDB에서 구조화된 그룹화 쿼리를 구현하는 집계 쿼리입니다. 첫 번째 $group 단계에서는 상품명(ProductName)과 상품 ID(ProductId)를 기준으로 문서를 묶고 $sum 연산자로 각 그룹의 개수를 계산합니다. 이어지는 두 번째 $group 단계에서는 productId를 기준으로 다시 그룹화하고, $push 연산자를 사용해 상품명과 카운트를 배열 형태로 정리합니다.
> db.demo534.aggregate(
... {
... $group:
... {
... _id:
... {
... productName: "$ProductName",
... productId: "$ProductId"
... },
... count:
... {
... $sum: 1
... }
... },
... },
... {
... $group:
... {
... _id: "$_id.productId",
... itemCounts:
... {
... "$push":
... {
... productName: "$_id.productName",
... count: "$count"
... }
... }
... }
... })4. 실행 결과 확인
위 집계 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{ "_id" : 101, "itemCounts" : [ { "productName" : "Product-1", "count" : 1 } ] }
{ "_id" : 100, "itemCounts" : [ { "productName" : "Product-2", "count" : 1 }, { "productName" : "Product-1", "count" : 1 } ] }결과를 보면 productId별로 문서가 그룹화되고, 각 그룹 안에는 productName과 해당 상품의 count가 포함된 itemCounts 배열이 새로운 필드로 생성된 것을 확인할 수 있습니다. 이처럼 두 단계의 $group을 조합하면 원본 데이터를 계층적으로 구조화하면서 동시에 카운트 정보까지 손쉽게 집계할 수 있습니다.