집계 파이프라인
집계 파이프라인은 문서를 처리하는 하나 이상의 단계로 구성됩니다.
각 단계는 입력 문서에 대한 연산을 수행합니다. 예를 들어, 한 단계에서는 문서를 필터링하고, 문서를 그룹화하고, 값을 계산할 수 있습니다.
한 단계에서 출력된 문서는 다음 단계로 전달됩니다.
집계 파이프라인은 문서 그룹에 대한 결과를 반환할 수 있습니다. 예를 들어 총값, 평균값, 최대값, 최소값을 반환할 수 있습니다.
집계 파이프라인을 사용하여 업데이트에 표시된 단계를 사용하는 경우 집계 파이프라인으로 문서를 업데이트할 수 있습니다.
MongoDB Atlas에서 호스팅되는 배포에 대해 UI에서 집계 파이프라인을 실행할 수 있습니다.
MongoDB Atlas UI에서 MongoDB Atlas에 집계 파이프라인을 실행하는 경우 각 단계에서 결과를 미리 볼 수 있습니다.
집계 파이프라인 예시
이 섹션에서는 다음 피자 orders
컬렉션을 사용하는 집계 파이프라인 예를 보여줍니다.
db.orders.insertMany( [ { _id: 0, name: "Pepperoni", size: "small", price: 19, quantity: 10, date: ISODate( "2021-03-13T08:14:30Z" ) }, { _id: 1, name: "Pepperoni", size: "medium", price: 20, quantity: 20, date : ISODate( "2021-03-13T09:13:24Z" ) }, { _id: 2, name: "Pepperoni", size: "large", price: 21, quantity: 30, date : ISODate( "2021-03-17T09:22:12Z" ) }, { _id: 3, name: "Cheese", size: "small", price: 12, quantity: 15, date : ISODate( "2021-03-13T11:21:39.736Z" ) }, { _id: 4, name: "Cheese", size: "medium", price: 13, quantity:50, date : ISODate( "2022-01-12T21:23:13.331Z" ) }, { _id: 5, name: "Cheese", size: "large", price: 14, quantity: 10, date : ISODate( "2022-01-12T05:08:13Z" ) }, { _id: 6, name: "Vegan", size: "small", price: 17, quantity: 10, date : ISODate( "2021-01-13T05:08:13Z" ) }, { _id: 7, name: "Vegan", size: "medium", price: 18, quantity: 10, date : ISODate( "2021-01-13T05:10:13Z" ) } ] )
총 주문 수량 계산
다음 집계 파이프라인 예시에는 두 단계가 포함되어 있으며 피자 이름별로 그룹화된 미디엄 사이즈 피자의 총 주문 수량을 반환합니다.
db.orders.aggregate( [ // Stage 1: Filter pizza order documents by pizza size { $match: { size: "medium" } }, // Stage 2: Group remaining documents by pizza name and calculate total quantity { $group: { _id: "$name", totalQuantity: { $sum: "$quantity" } } } ] )
$match
단계:
피자 주문 문서를
size
가medium
인 피자로 필터링합니다.남아있는 문서를
$group
단계로 전달합니다.
$group
단계:
나머지 문서를 피자
name
별로 그룹화합니다.$sum
을 사용하여 각 피자name
의 총 주문quantity
을 계산합니다. 총계는 집계 파이프라인에서 반환된totalQuantity
필드에 저장됩니다.
출력 예시:
[ { _id: 'Cheese', totalQuantity: 50 }, { _id: 'Vegan', totalQuantity: 10 }, { _id: 'Pepperoni', totalQuantity: 20 } ]
총 주문 금액 및 평균 주문 수량 계산
다음 예에서는 두 날짜 사이의 총 피자 주문 금액과 평균 주문 수량을 계산합니다.
db.orders.aggregate( [ // Stage 1: Filter pizza order documents by date range { $match: { "date": { $gte: new ISODate( "2020-01-30" ), $lt: new ISODate( "2022-01-30" ) } } }, // Stage 2: Group remaining documents by date and calculate results { $group: { _id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }, totalOrderValue: { $sum: { $multiply: [ "$price", "$quantity" ] } }, averageOrderQuantity: { $avg: "$quantity" } } }, // Stage 3: Sort documents by totalOrderValue in descending order { $sort: { totalOrderValue: -1 } } ] )
$match
단계:
$group
단계:
각 그룹에 대해 다음 사항을 계산합니다:
그룹화된 문서를
$sort
단계로 전달합니다.
$sort
단계:
각 그룹의 총 주문 금액을 기준으로 내림차순으로(
-1
) 문서를 정렬합니다.정렬된 문서를 반환합니다.
출력 예시:
[ { _id: '2022-01-12', totalOrderValue: 790, averageOrderQuantity: 30 }, { _id: '2021-03-13', totalOrderValue: 770, averageOrderQuantity: 15 }, { _id: '2021-03-17', totalOrderValue: 630, averageOrderQuantity: 30 }, { _id: '2021-01-13', totalOrderValue: 350, averageOrderQuantity: 10 } ]
추가 집계 파이프라인 단계 세부 정보
집계 파이프라인은 문서를 처리하는 하나 이상의 단계로 구성됩니다.
한 단계가 모든 입력 문서에 대해 하나의 문서를 출력할 필요는 없습니다. 예를 들어, 일부 단계에서는 새 문서를 생성하거나 문서를 필터링할 수 있습니다.
이러한 단계 예외를 제외하고 동일한 단계가 파이프라인에 여러 번 나타날 수 있습니다:
$out
,$merge
및$geoNear
.특정 단계에서 평균을 계산하고 다른 계산을 수행하려면 집계 연산자를 지정하는 집계 표현식을 사용하세요. 다음 섹션에서 집계 표현식에 대해 자세히 알아보겠습니다.
모든 집계 단계에 대해 집계 단계를 참조하세요
집계 표현식 및 연산자
일부 집계 파이프라인 단계에서는 표현식을 허용합니다. 연산자는 입력 표현식을 기반으로 값을 계산합니다.
MongoDB 쿼리 언어에서는 다음 구성 요소에서 표현식을 빌드할 수 있습니다.
구성 요소 | 예시 |
---|---|
상수 | 3 |
연산자 | |
필드 경로 표현식 | "$<path.to.field>" |
예를 들어, { $add: [ 3, "$inventory.total" ] }
은 $add
연산자와 두 개의 입력 표현식으로 구성된 표현식입니다.
상수
3
필드 경로 표현식
"$inventory.total"
표현식은 입력 문서의 경로 inventory.total
에 있는 값에 3을 더한 결과를 반환합니다.
필드 경로
필드 경로 표현식은 입력 문서의 필드에 액세스하는 데 사용됩니다. 필드 경로를 지정하려면 필드 이름 또는 점으로 구분된 필드 이름(필드가 내장된 문서에 있는 경우) 앞에 달러 기호 $
를 붙입니다. 예를 들어 user
필드의 필드 경로를 지정하려면 "$user"
, 내장 "user.name"
필드의 필드 경로를 지정하려면 "$user.name"
를 입력합니다.
"$<field>"
, "$$CURRENT.<field>"
에 해당하며, 여기서 CURRENT
는 특정 단계에서 달리 명시되지 않는 한 현재 객체의 루트로 기본 설정되는 시스템 변수입니다.
집계 파이프라인실행
집계 파이프라인을 실행하려면 다음을 사용하세요.
집계 파이프라인을 사용하여 문서 업데이트하기
집계 파이프라인을 사용하여 문서를 업데이트하려면 다음을 사용하세요.
기타 고려 사항
집계 파이프라인 제한 사항
집계 파이프라인에는 값 유형 및 결과 크기에 제한이 있습니다. 집계 파이프라인 제한을 참조하세요.
집계 파이프라인 및 샤드 컬렉션
집계 파이프라인은 샤드 컬렉션의 작업을 지원합니다. 집계 파이프라인 및 샤드 컬렉션을 참조하세요.
맵 리듀스의 대안으로서의 집계 파이프라인
MongoDB 5.0부터 맵 리듀스는 더 이상 사용되지 않습니다.
맵 리듀스 대신 집계 파이프라인을 사용해야 합니다. 집계 파이프라인은 맵 리듀스보다 성능과 유용성 측면에서 더 우수합니다.
$group
,$merge
등과 같은 집계 파이프라인 단계를 사용하여 맵 리듀스 작업을 다시 작성할 수 있습니다.사용자 지정 기능이 필요한 맵 리듀스 작업의 경우
$accumulator
및$function
집계 연산자를 사용할 수 있습니다. 이러한 연산자를 사용하여 JavaScript에서 사용자 지정 집계 표현식을 정의할 수 있습니다.
맵 리듀스 대안으로서의 집계 파이프라인 예시는 다음을 참조하세요.
자세히 알아보기
집계 파이프라인에 대해 자세히 알아보려면 다음을 참조하세요.