$avg, $sum, $max와 같은 일부 집계 연산자는 둘 이상의 컨텍스트에 나타나며, 각 컨텍스트는 연산자 서로 다른 동작을 제공합니다. 예시 들면 다음과 같습니다.
$avg은(는) 표현식 으로 배열 에 있는 요소의 평균을 반환합니다.축적자 자
$avg는 문서 그룹 의 값의 평균을 반환합니다.창 함수로서
$avg은( 창 에 있는 문서 값의 평균을 반환합니다.
연산자 포함된 단계에 따라 동작이 결정됩니다. 동일한 연산자 이름이 다른 인수를 허용할 수 있으며 사용 위치에 따라 다른 결과를 반환할 수 있습니다. 이 페이지에서는 세 가지 컨텍스트와 이를 명확하게 구분하는 방법을 설명합니다.
다음 다이어그램은 표현식, 축적자 및 창 함수가 실행되는 방식을 개념화합니다.
다음 표에는 세 가지 연산자 유형의 차이점이 요약되어 있습니다.
연산자 유형 | 행동 | 사용할 수 있는 곳 |
|---|---|---|
표현식 | 각 입력 문서 평가하고 문서 당 하나의 값을 반환합니다. |
|
축적자 | 입력 문서 그룹 에 대해 애그리게이션하고 그룹 하나의 애그리게이션 값을 반환합니다. | |
창 기능 | 입력 문서 창 에서 평가되고 문서 당 하나의 값을 반환합니다. |
표현식
표현식 단일 입력 문서 의 값으로 해석됩니다. 표현식은 입력을 변경하지 않습니다.
표현식 연산자는 인수 배열 허용하며 다음과 같은 일반적인 형식을 갖습니다.
{ <operator>: [ <argument1>, <argument2> ... ] }연산자 단일 인수를 허용하는 경우 외부 배열 생략할 수 있습니다.
표현식은 축적자와 창 함수에 대한 인수도 제공합니다. 예시 들어 { $sum: "$price" }에서 필드 경로 "$price"는 표현식 입니다.
축적자
축적자 다양한 수의 입력 문서에서 합계, 최대값, 최소값과 같은 단일 애그리게이션 값을 계산합니다. 실제 구현에서 축적자는 그룹화 작업을 실행하는 동안 프로세스 문서 간의 상태 유지합니다.
$group 단계에서 반환된 출력 문서 수는 그룹 수와 동일합니다. 축적자 이러한 각 그룹에 대해 그룹 전체의 집계 값을 계산합니다.
그룹화 작업을 수행하는 집계 파이프라인 단계 에서 축적자를 사용할 수 있습니다.
자세한 학습 은 축적자를 참조하세요.
기간 기능
창 함수는 현재 문서 기준으로 정의된 문서의 범위인 창 기반으로 하는 값을 반환합니다.$setWindowFields 단계의 partitionBy, sortBy 및 window 필드로 창 정의합니다.
축적자와 창 함수 모두로 작동하는 연산자의 경우 차이점은 연산자 애그리게이션하는 항목과 반환하는 값의 수입니다.
연산자 축적자 자로서 문서 그룹 에 대해 집계하고 그룹 에 대한 단일 값을 반환합니다.
창 함수인 연산자 문서 창 에 대해 집계하고 각 문서 에 대한 값을 반환합니다.
창 함수는 $setWindowFields 단계에서만 사용할 수 있습니다. $setWindowFields는 $rank 및 $shift와 같은 창에 특정한 연산자도 지원합니다.
예시
이 페이지의 예시는 sample_mflix 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB 배포서버에 로드하는 방법에 대한 자세한 내용은 샘플 데이터세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우, 이 페이지의 예시를 실행하려면 데이터베이스를 제거하고 다시 생성해야 할 수 있습니다.
다음 예시에서는 세 가지 컨텍스트 모두에서 $sum을(를) 사용합니다. 각각은 컨텍스트가 연산자의 동작을 결정하는 방법을 보여주는 서로 다른 결과를 반환합니다.
표현식 예제
다음 예시 $sum 을 표현식 으로 사용하여 각 문서 내에 두 개의 필드를 추가합니다. 파이프라인 일치하는 각 문서 에 대해 하나의 합계를 반환합니다.
db.movies.aggregate( [ { $match: { title: { $in: [ "The Godfather", "Inception", "The Dark Knight" ] } } }, { $project: { _id: 0, title: 1, totalAwards: { $sum: [ "$awards.wins", "$awards.nominations" ] } } }, { $sort: { totalAwards: -1 } }] )축적자 예제
다음 예시 $sum를 축적자 사용하여 각 그룹 의 모든 문서 에서 하나의 필드 합산합니다. 파이프라인 각 문서 에 대해 하나의 합계를 반환하는 대신 각 콘텐츠 등급에 대해 하나의 합계를 반환합니다.
db.movies.aggregate( [ { $match: { rated: { $in: [ "G", "PG", "PG-13", "R" ] }, "imdb.votes": { $type: "int" } } }, { $group: { _id: "$rated", totalVotes: { $sum: "$imdb.votes" } } }, { $sort: { _id: 1 } }] )창 함수 예제
다음 예시 $sum을 창 함수로 사용하여 문서 창 에서 하나의 필드 합계를 구합니다. 파이프라인 각 문서 의 실행 를 반환하며, 이 합계는 문서의 창 에 따라 달라집니다.
db.movies.aggregate( [ { $match: { genres: "Musical", year: { $in: [ 2009, 2010 ] }, "imdb.rating": { $type: "double" }, "imdb.votes": { $gt: 0 } } }, { $setWindowFields: { partitionBy: "$year", sortBy: { title: 1 }, output: { cumulativeVotesInYear: { $sum: "$imdb.votes", window: { documents: [ "unbounded", "current" ] } }, rankInYear: { $documentNumber: {} } } } }, { $project: { _id: 0, title: 1, year: 1, "imdb.votes": 1, cumulativeVotesInYear: 1, rankInYear: 1 } }, { $sort: { year: 1, title: 1 } }] )