$median(집계)
정의
$median
버전 7.0에 추가.
번째 백분위 인 중앙값 의 50근사치를 스칼라 값으로 반환합니다.
구문
$median
의 구문은 다음과 같습니다.
{ $median: { input: <number>, method: <string> } }
명령 필드
$median
은(는) 다음 필드를 사용합니다.
필드 | 유형 | 필요성 | 설명 |
---|---|---|---|
| 표현식 | 필수 사항 |
|
| 문자열 | 필수 사항 |
|
행동
다음에 $median
을 사용할 수 있습니다.
$group
단계를 축적자로 사용$setWindowFields
단계를 축적자로 사용$project
단계를 집계 표현식으로 사용
$median
축적자로서 다음과 같은 특성을 가지고 있습니다.
단계의 모든 문서에 대해 단일 결과를 계산합니다.
t-digest 알고리즘 을 사용하여 대략적인 백분위 기반 지표 를 계산합니다.
근사치 메서드를 사용하여 대량의 데이터로 확장합니다.
$median
집계 표현식으로서 다음과 같은 특성을 가지고 있습니다.
배열을 입력으로 받습니다.
각 입력 문서에 대해 별도의 결과를 계산합니다.
작업 유형
$group
단계에서 $median
은 축적자이며 창에 있는 모든 문서의 값을 계산합니다.
$project
단계에서 $median
은 집계 표현식이며 각 문서의 값을 계산합니다.
$setWindowFields
단계에서 $median
은 집계 표현식과 같이 각 문서에 대한 결과를 반환하지만 결과는 축적자처럼 문서 그룹에 대해 계산됩니다.
계산 고려 사항
$group
단계에서 $median
은 항상 대략적인 계산 메서드를 사용합니다.
$project
단계에서 $median
은 대략적인 메서드가 지정된 경우에도 이산 계산 메서드를 사용할 수 있습니다.
$setWindowFields
단계에서 워크로드는 $median
이 사용하는 계산 메서드를 결정합니다.
계산된 백분위수 $median
반환값은 동일한 데이터 세트에서도 다를 수 있습니다. 이는 알고리즘이 근사치를 계산하기 때문입니다.
중복된 샘플은 모호함을 유발할 수 있습니다. 중복된 수가 많은 경우 백분위수 값이 실제 표본 분포를 나타내지 않을 수 있습니다. 모든 표본이 동일한 데이터 세트를 가정해 보겠습니다. 데이터 세트의 모든 값이 특정 백분위수 이하에 속합니다. "50번째 백분위수" 값은 실제로 샘플의 0% 또는 100%를 나타내게 됩니다.
배열 입력
$project
단계에서 $median
을 집계 표현식으로 사용하는 경우 배열을 입력으로 사용할 수 있습니다. $median
는 숫자가 아닌 배열 값을 무시합니다.
구문은 다음과 같습니다.
{ $median: { input: [ <expression1, <expression2>, ..., <expressionN> ], method: <string> } }
기간 기능
창 함수를 사용하면 인접 문서의 움직이는 "창"에서 결과를 계산할 수 있습니다. 각 문서가 파이프라인을 통과할 때 $setWindowFields
단계는 다음을 수행합니다.
현재 창에서 문서 세트를 다시 계산합니다.
세트의 모든 문서에 대한 값을 계산합니다.
해당 문서에 대한 단일 값을 반환합니다.
$setWindowFields
단계에서 $median
을 사용하여 time series 또는 기타 관련 데이터에 대한 롤링 통계를 계산할 수 있습니다.
$setWindowField
단계에서 $median
을 사용하는 경우 input
값은 필드 이름이어야 합니다. 필드 이름 대신 배열을 입력하면 작업이 실패합니다.
예시
다음 예시에서는 testScores
컬렉션을 사용합니다. 컬렉션을 만듭니다:
db.testScores.insertMany( [ { studentId: "2345", test01: 62, test02: 81, test03: 80 }, { studentId: "2356", test01: 60, test02: 83, test03: 79 }, { studentId: "2358", test01: 67, test02: 82, test03: 78 }, { studentId: "2367", test01: 64, test02: 72, test03: 77 }, { studentId: "2369", test01: 60, test02: 53, test03: 72 } ] )
를 $median
축적자로 사용
중간값을 계산하는 축적자를 만듭니다.
db.testScores.aggregate( [ { $group: { _id: null, test01_median: { $median: { input: "$test01", method: 'approximate' } } } } ] )
출력:
{ _id: null, test01_median: 62 }
_id
필드 값은 null
이므로 $group
은 컬렉션의 모든 문서를 선택합니다.
$median
축적자는 test01
필드에서 입력을 가져옵니다. $median
는 필드의 중앙값, 이 예시에서는 62
를 계산합니다.
단계에서 사용 $median
$project
$group
단계에서 $median
은 축적자이며 모든 문서에 대한 하나의 값을 계산합니다. $project
단계에서 $median
은 집계 표현식이며 각 문서의 값을 계산합니다.
$project
단계에서 필드 이름 또는 배열을 입력으로 사용할 수 있습니다.
db.testScores.aggregate( [ { $project: { _id: 0, studentId: 1, testMedians: { $median: { input: [ "$test01", "$test02", "$test03" ], method: 'approximate' } } } } ] )
출력:
{ studentId: '2345', testMedians: 80 }, { studentId: '2356', testMedians: 79 }, { studentId: '2358', testMedians: 78 }, { studentId: '2367', testMedians: 72 }, { studentId: '2369', testMedians: 60 }
$median
이 집계 표현식인 경우 각 studentId
에 대한 결과가 있습니다.
단계에서 사용 $median
$setWindowField
로컬 데이터 추세를 기반으로 백분위수 값을 만들려면 $setWindowField
집계 파이프라인 단계에서 $median
을 사용합니다.
이 예에서는 점수를 필터링하는 창을 생성합니다.
db.testScores.aggregate( [ { $setWindowFields: { sortBy: { test01: 1 }, output: { test01_median: { $median: { input: "$test01", method: 'approximate' }, window: { range: [ -3, 3 ] } } } } }, { $project: { _id: 0, studentId: 1, test01_median: 1 } } ] )
출력:
{ studentId: '2356', test01_median: 60 }, { studentId: '2369', test01_median: 60 }, { studentId: '2345', test01_median: 60 }, { studentId: '2367', test01_median: 64 }, { studentId: '2358', test01_median: 64 }
이 예에서 각 문서의 중간값 계산에는 앞뒤의 세 문서의 데이터도 통합됩니다.
자세히 알아보기
$percentile
연산자는 하나 이상의 백분위수 값을 설정할 수 있는 $median
연산자의 보다 일반적인 버전입니다.
창 함수에 대한 자세한 내용은 $setWindowFields
를 참조하세요.