문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

집계 파이프라인

이 페이지의 내용

  • Aggregation pipeline 예시
  • 추가 애그리게이션 파이프라인 단계 세부 정보
  • 애그리게이션 파이프라인 표현식
  • Aggregation pipeline실행
  • 애그리게이션 파이프라인을 사용하여 문서 업데이트하기
  • 기타 고려 사항
  • 자세히 알아보기

Aggregation pipeline은 문서를 처리하는 하나 이상의 단계로 구성됩니다.

  • 각 단계는 입력 문서에 대한 연산을 수행합니다. 예를 들어, 한 단계에서는 문서를 필터링하고, 문서를 그룹화하고, 값을 계산할 수 있습니다.

  • 한 단계에서 출력된 문서는 다음 단계로 전달됩니다.

  • 집계 파이프라인은 문서 그룹에 대한 결과를 반환할 수 있습니다. 예를 들어 총값, 평균값, 최대값, 최소값을 반환할 수 있습니다.

MongoDB 4.2부터는 Aggregation Pipeline을 사용한 업데이트에 표시된 단계를 사용하면 집계 파이프라인으로 문서를 업데이트할 수 있습니다.

참고

MongoDB Atlas 에서 호스팅되는배포서버를 위해 UI에서 집계 파이프라인을 실행할 수 있습니다.

MongoDB Atlas UI에서 MongoDB Atlas에 애그리게이션 파이프라인을 실행하는 경우 각 단계에서 결과를 미리 볼 수 있습니다.

이 섹션에서는 다음 피자 orders 컬렉션을 사용하는 aggregation pipeline 예를 보여줍니다.

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 단계:

  • 피자 주문 문서를 sizemedium인 피자로 필터링합니다.

  • 남아있는 문서를 $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 단계:

  • $gte$lt을 사용하여 지정된 날짜 범위의 피자 주문 문서를 필터링합니다

  • 남아있는 문서를 $group 단계로 전달합니다.

$group 단계:

$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 }
]

다음도 참조하세요.

Aggregation pipeline은 문서를 처리하는 하나 이상의 단계로 구성됩니다.

  • 한 단계가 모든 입력 문서에 대해 하나의 문서를 출력할 필요는 없습니다. 예를 들어, 일부 단계에서는 새 문서를 생성하거나 문서를 필터링할 수 있습니다.

  • 이러한 단계 예외를 제외하고 동일한 단계가 파이프라인에 여러 번 나타날 수 있습니다: $out, $merge$geoNear.

  • 특정 단계에서 평균을 계산하고 다른 계산을 수행하려면 애그리게이션 연산자를 지정하는 애그리게이션 표현식을 사용하세요. 다음 섹션에서 애그리게이션 표현식에 대해 자세히 알아보겠습니다.

모든 집계 단계에 대해서는 집계 파이프라인 단계를 참조하세요.

일부 애그리게이션 파이프라인 단계에서는 다음과 같은 애그리게이션 표현식을 허용합니다.

$accumulator$function 애그리게이션 연산자를 사용하여 JavaScript에서 사용자 지정 애그리게이션 표현식을 정의할 수 있습니다.

모든 집계 표현식은 표현식을 참조하세요.

aggregation pipeline을 실행하려면 다음을 사용하세요.

aggregation pipeline을 사용하여 문서를 업데이트하려면 다음을 사용하세요.

명령
mongosh 방법
findAndModify

애그리게이션 파이프라인에는 값 유형 및 결과 크기에 제한이 있습니다. 집계 파이프라인 제한을 참조하세요.

애그리게이션 파이프라인은 샤드 컬렉션의 작업을 지원합니다. 애그리게이션 파이프라인 및 샤드 컬렉션을 참조하세요.

MongoDB 5.0부터 맵 리듀스는 더 이상 사용되지 않습니다.

  • 맵 리듀스 대신 집계 파이프라인을 사용해야 합니다. 집계 파이프라인은 맵 리듀스보다 성능과 유용성 측면에서 더 우수합니다.

  • $group, $merge 등과 같은 애그리게이션 파이프라인 단계를 사용하여 맵 리듀스 작업을 다시 작성할 수 있습니다.

  • 사용자 지정 기능이 필요한 맵 리듀스 작업의 경우 $accumulator$function 애그리게이션 연산자를 사용할 수 있습니다. 이러한 연산자를 사용하여 JavaScript에서 사용자 지정 애그리게이션 표현식을 정의할 수 있습니다.

맵 리듀스 대안으로서의 애그리게이션 파이프라인 예시는 다음을 참조하세요.

aggregation pipeline에 대해 자세히 알아보려면 다음을 참조하세요.

← 집계 작업