$avg, $sum, $max와 같은 일부 집계 연산자는 둘 이상의 컨텍스트에 나타나며, 각 컨텍스트는 연산자에 서로 다른 동작을 부여합니다. 예시는 다음과 같습니다.
표현식으로서
$avg은(는) 배열 내 요소들의 평균을 반환합니다.축적자로서
$avg은(는) 문서 그룹 전체의 값 평균을 반환합니다.창 함수로서
$avg은(는) 창에 있는 문서의 값 평균을 반환합니다.
연산자를 포함하는 단계에 따라 해당 동작이 결정됩니다. 동일한 연산자 이름이라도 사용 위치에 따라 서로 다른 인수를 허용하고 서로 다른 결과를 반환할 수 있습니다. 이 페이지에서는 세 가지 컨텍스트와 이를 구분하는 방법을 설명합니다.
다음 다이어그램은 표현식, 축적자 및 창 함수가 실행되는 방식을 개념화합니다.
다음 표는 세 가지 연산자 유형이 어떻게 다른지 요약합니다.
연산자 유형 | 행동 | 사용 가능한 곳 |
|---|---|---|
표현식 | 각 입력 문서에 대해 평가되며 문서당 하나의 값을 반환합니다. |
|
축적자 | 입력 문서 그룹에 대해 집계를 수행하고 그룹당 하나의 집계 값을 반환합니다. | |
창 함수 | 입력 문서의 창에 대해 평가되며 문서당 하나의 값을 반환합니다. |
|
표현식
표현식은 단일 입력 문서에 대해 값으로 확인됩니다. 표현식은 입력을 변경하지 않습니다.
표현식 연산자는 인수의 배열을 허용하며 다음과 같은 일반적인 형식을 갖습니다:
{ <operator>: [ <argument1>, <argument2> ... ] }연산자가 단일 인수를 허용하는 경우 외부 배열을 생략할 수 있습니다.
표현식은 축적자와 창 함수를 위한 인수도 제공합니다. 예시, { $sum: "$price" }에서 필드 경로 "$price"은(는) 표현식입니다.
자세한 내용은 표현식을 참조하세요.
축적자
축적자는 다양한 수의 입력 문서에 걸쳐 합계, 최대값 또는 최소값과 같은 단일 집계 값을 계산합니다. 실제 구현에서 축적자는 그룹화 작업을 실행하는 동안 처리하는 문서 간의 상태를 유지합니다.
$group 단계에서 반환되는 출력 문서의 수는 그룹 수와 같습니다. 이러한 각 그룹에 대해 축적자는 그룹 전체의 집계 값을 계산합니다.
그룹화 작업을 수행하는 집계 파이프라인 단계에서 축적자를 사용할 수 있습니다.
자세한 내용은 축적자를 참조하세요.
기간 기능
창 함수는 현재 문서를 기준으로 정의된 문서 범위인 창을 기반으로 값을 반환합니다. $setWindowFields 단계의 partitionBy, sortBy, window 필드로 창을 정의합니다.
축적자와 창 함수로 모두 작동하는 연산자의 경우, 차이점은 연산자가 무엇을 집계하고 얼마나 많은 값을 반환하는지에 있습니다.
축적자로서 이 연산자는 문서 그룹을 집계하고 해당 그룹에 대해 단일 값을 반환합니다.
창 함수로서 이 연산자는 문서 창에 대해 집계하고 각 문서에 대한 값을 반환합니다.
창 함수는 $setWindowFields 단계에서만 사용할 수 있습니다. $setWindowFields는 $rank 및 $shift과 같이 Windows 전용 연산자도 지원합니다.
자세한 내용은 창 함수를 참조하세요.
예시
이 페이지의 예시는 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 } }] )