MongoDB 집계에서 배열 요소의 하위 집합 합산하기
배열 요소 중 일부(하위 집합)만 골라서 합산하려면 $first 연산자와 $sum 연산자를 함께 사용하면 됩니다. 먼저 문서가 포함된 컬렉션을 생성해 보겠습니다.
> db.demo610.insertOne({Values:[10,20,30,40,50]});
{
"acknowledged" : true, "insertedId" : ObjectId("5e9747b8f57d0dc0b182d62e")
}컬렉션 데이터 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo610.find().pretty()
위 명령을 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e9747b8f57d0dc0b182d62e"),
"Values" : [
10,
20,
30,
40,
50
]
}배열 요소의 하위 집합을 합산하는 쿼리
다음은 MongoDB 집계 파이프라인에서 배열 요소의 하위 집합을 합산하는 쿼리입니다.
> db.demo610.aggregate([
... {$unwind:"$Values"},
... {$group:{"_id":"$_id",
... "1st":{$first:"$Values"},
... "All":{$sum:"$Values"}}},
... {$project:{"_id":"$_id",
... "SumOfAllMinus1":{$subtract:["$All","$1st"]}}},
... {$group:{"_id":null,
... "SumOfAllExcept1stValue":{$sum:"$SumOfAllMinus1"}}}
... ])
쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{ "_id" : null, "SumOfAllExcept1stValue" : 140 }쿼리 동작 원리
이 쿼리는 다음 단계로 진행됩니다.
1. $unwind: Values 배열을 개별 문서로 분해하여 각 숫자(10, 20, 30, 40, 50)가 하나의 문서가 되도록 만듭니다.
2. $group: _id 기준으로 그룹화하면서 $first로 첫 번째 값(10)을 저장하고, $sum으로 배열 전체의 합계(150)를 계산합니다.
3. $project: $subtract 연산자를 사용해 전체 합계에서 첫 번째 값을 뺀 결과(150 - 10 = 140)를 계산합니다.
4. $group: 마지막으로 $sum을 통해 모든 문서의 결과를 합산하여 최종 값 140을 반환합니다.
즉, 배열의 첫 번째 요소를 제외한 나머지 요소들의 합계를 손쉽게 구할 수 있습니다. 이 패턴을 응용하면 특정 위치의 요소나 조건에 맞는 요소만 제외한 합산도 가능합니다.