Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB 집계 파이프라인에서 배열 요소의 하위 집합 합산하기

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을 반환합니다.

즉, 배열의 첫 번째 요소를 제외한 나머지 요소들의 합계를 손쉽게 구할 수 있습니다. 이 패턴을 응용하면 특정 위치의 요소나 조건에 맞는 요소만 제외한 합산도 가능합니다.