MongoDB에서 동일한 제품 ID를 가진 문서들의 가격을 하나로 합산하려면 $group 단계를 사용해야 합니다. $group은 지정된 _id 표현식을 기준으로 문서들을 그룹화하고, $sum 같은 누적 연산자와 함께 사용하면 각 그룹별 합계를 손쉽게 계산할 수 있습니다.
1. 샘플 컬렉션 생성
먼저 실습에 사용할 컬렉션과 문서를 생성해 보겠습니다.
> db.aggreagateDemo.insertOne({"Product_Id":1,"ProductPrice":50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06d3c025ddae1f53b621d9")
}
> db.aggreagateDemo.insertOne({"Product_Id":2,"ProductPrice":100});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06d3c625ddae1f53b621da")
}
> db.aggreagateDemo.insertOne({"Product_Id":2,"ProductPrice":500});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06d3cb25ddae1f53b621db")
}
> db.aggreagateDemo.insertOne({"Product_Id":1,"ProductPrice":150});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06d3d125ddae1f53b621dc")
}위 예제에서는 제품 ID 1번과 2번이 각각 두 개씩 존재합니다. 즉, 같은 제품의 가격 데이터가 여러 문서로 나뉘어 저장된 상황입니다.
2. 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.aggreagateDemo.find().pretty();
위 쿼리는 다음과 같은 결과를 출력합니다.
{
"_id" : ObjectId("5e06d3c025ddae1f53b621d9"),
"Product_Id" : 1,
"ProductPrice" : 50
}
{
"_id" : ObjectId("5e06d3c625ddae1f53b621da"),
"Product_Id" : 2,
"ProductPrice" : 100
}
{
"_id" : ObjectId("5e06d3cb25ddae1f53b621db"),
"Product_Id" : 2,
"ProductPrice" : 500
}
{
"_id" : ObjectId("5e06d3d125ddae1f53b621dc"),
"Product_Id" : 1,
"ProductPrice" : 150
}3. $group으로 ID별 가격 합산하기
이제 aggregate() 메서드에 $group 단계를 적용하여 Product_Id 기준으로 문서를 묶고, $sum 연산자로 가격의 합계를 구해 보겠습니다.
> db.aggreagateDemo.aggregate([
... {
... $group: {
... _id: "$Product_Id",
... TotalValue: {$sum: "$ProductPrice"}
... }
... }
... ]
... );실행 결과는 다음과 같습니다.
{ "_id" : 2, "TotalValue" : 600 }
{ "_id" : 1, "TotalValue" : 200 }결과 해석
출력 결과를 보면 다음과 같이 계산되었습니다.
- Product_Id 1: 50 + 150 = 200
- Product_Id 2: 100 + 500 = 600
이처럼 $group에서 _id 필드에 그룹화 기준이 될 필드(여기서는 "$Product_Id")를 지정하고, 누적 연산자 $sum으로 합산할 필드("$ProductPrice")를 지정하면 동일한 ID를 가진 문서들의 값을 손쉽게 집계할 수 있습니다. 이 방식은 매출 합계, 재고 수량 집계 등 다양한 통계 처리에 활용할 수 있습니다.