문서 메뉴
문서 홈
/
MongoDB 매뉴얼
/ / /

$median(애그리게이션)

이 페이지의 내용

  • 정의
  • 구문
  • 명령 필드
  • 행동
  • 예제
  • 자세히 알아보기
$median

버전 7.0에 추가.

번째 백분위수 인 중앙값 의 근사치를 50 스칼라 값으로 반환합니다.

$median$group 단계에서 축적자로 사용하거나 집계 표현식으로 사용할 수 있습니다.

$median의 구문은 다음과 같습니다.

{
$median: {
input: <number>,
method: <string>
}
}

$median 은(는) 다음 필드를 사용합니다.

필드
유형
필요성
설명
input
표현식
필수 사항
$median은 이 데이터의 50번째 백분위 값을 계산합니다. input은 필드 이름 또는 숫자 유형으로 평가되는 표현식이어야 합니다. 표현식을 숫자 유형으로 변환할 수 없는 경우, $median 계산은 이를 무시합니다.
method
문자열
필수 사항
mongod가 50번째 백분위수 값을 계산하는 데 사용하는 메서드입니다. 메서드는 'approximate'여야 합니다.

다음에 $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 }
] )

중간값을 계산하는 축적자를 만듭니다.

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를 계산합니다.

$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에 대한 결과가 있습니다.

로컬 데이터 추세를 기반으로 백분위수 값을 만들려면 $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를 참조하세요.

← maxN(배열 연산자)