Docs Menu
Docs Home
/
MongoDB 매뉴얼
/ / /

$percentile(집계)

이 페이지의 내용

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

버전 7.0에 추가.

지정된 백분위 값에 해당하는 스칼라 값의 배열 을 반환합니다.

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

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

{
$percentile: {
input: <expression>,
p: [ <expression1>, <expression2>, ... ],
method: <string>
}
}

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

필드
유형
필요성
설명
input
표현식
필수 사항
$percentile 이 데이터의 백분위 값을 계산합니다. input 은 필드 이름 또는 숫자 유형으로 평가되는 표현식 이어야 합니다. 표현식 을 숫자 유형으로 변환할 수 없는 경우 $percentile 계산에서는 이를 무시합니다.
p
표현식
필수 사항

$percentile p의 각 요소에 대한 백분위수 값을 계산합니다. 요소는 백분율을 나타내며 0.0 ~ 1.0 범위의 숫자 값으로 평가되어야 합니다.

$percentile p의 요소와 동일한 순서로 결과를 반환합니다.

method
문자열
필수 사항
mongod가 백분위수 값을 계산하는 데 사용하는 메서드입니다. 메서드는 'approximate'여야 합니다.

다음에 $percentile을 사용할 수 있습니다.

  • $group 단계를 축적자로 사용

  • $setWindowFields 단계를 축적자로 사용

  • $project 단계를 집계 표현식으로 사용

$percentile 축적자로서 다음과 같은 특성을 가지고 있습니다.

  • 단계의 모든 문서에 대해 단일 결과를 계산합니다.

  • t-digest 알고리즘 을 사용하여 대략적인 백분위 기반 지표 를 계산합니다.

  • 근사치 메서드를 사용하여 대량의 데이터로 확장합니다.

$percentile 집계 표현식으로서 다음과 같은 특성을 가지고 있습니다.

  • 배열을 입력으로 받습니다.

  • 각 입력 문서에 대해 별도의 결과를 계산합니다.

$group 단계에서 $percentile은 축적자이며 창에 있는 모든 문서의 값을 계산합니다.

$project 단계에서 $percentile은 집계 표현식이며 각 문서의 값을 계산합니다.

$setWindowFields 단계에서 $percentile은 집계 표현식과 같이 각 문서에 대한 결과를 반환하지만 결과는 축적자처럼 문서 그룹에 대해 계산됩니다.

$group 단계에서 $percentile은 항상 대략적인 계산 메서드를 사용합니다.

$project 단계에서 $percentile은 대략적인 메서드가 지정된 경우에도 이산 계산 메서드를 사용할 수 있습니다.

$setWindowFields 단계에서 워크로드는 $percentile이 사용하는 계산 메서드를 결정합니다.

계산된 백분위수 $percentile 반환값은 동일한 데이터 세트에서도 다를 수 있습니다. 이는 알고리즘이 근사치를 계산하기 때문입니다.

중복된 샘플은 모호함을 유발할 수 있습니다. 중복된 수가 많은 경우 백분위수 값이 실제 표본 분포를 나타내지 않을 수 있습니다. 모든 표본이 동일한 데이터 세트를 가정해 보겠습니다. 데이터 세트의 모든 값이 특정 백분위수 이하에 속합니다. "50번째 백분위수" 값은 실제로 샘플의 0% 또는 100%를 나타내게 됩니다.

$percentile p = 0.0의 최소값을 반환합니다.

$percentile p = 1.0의 최대값을 반환합니다.

$project 단계에서 $percentile을 집계 표현식으로 사용하는 경우 배열을 입력으로 사용할 수 있습니다. 구문은 다음과 같습니다.

{
$percentile: {
input: [ <expression1, <expression2>, .., <expressionN> ],
p: [ <expression1>, <expression2>, ... ],
method: <string>
}
}

창 함수를 사용하면 인접 문서의 움직이는 "창"에서 결과를 계산할 수 있습니다. 각 문서가 파이프라인을 통과할 때 $setWindowFields 단계는 다음을 수행합니다.

  • 현재 창에서 문서 세트를 다시 계산합니다.

  • 세트의 모든 문서에 대한 값을 계산합니다.

  • 해당 문서에 대한 단일 값을 반환합니다.

$setWindowFields 단계에서 $percentile을 사용하여 time series 또는 기타 관련 데이터에 대한 롤링 통계를 계산할 수 있습니다.

$setWindowField 단계에서 $percentile을 사용하는 경우 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_percentiles: {
$percentile: {
input: "$test01",
p: [ 0.95 ],
method: 'approximate'
}
},
}
}
] )

출력:

{ _id: null, test01_percentiles: [ 67 ] }

_id 필드 값은 null이므로 $group은 컬렉션의 모든 문서를 선택합니다.

percentile 축적자는 test01 필드에서 입력 데이터를 가져옵니다.

이 예시에서 백분위수 배열 p는 하나의 값을 가지므로 $percentile 연산자는 test01 데이터에 대해 하나의 항만 계산합니다. 95번째 백분위수 값은 67입니다.

여러 백분위수 값을 계산하는 축적자를 만듭니다.

db.testScores.aggregate( [
{
$group: {
_id: null,
test01_percentiles: {
$percentile: {
input: "$test01",
p: [ 0.5, 0.75, 0.9, 0.95 ],
method: 'approximate'
}
},
test02_percentiles: {
$percentile: {
input: "$test02",
p: [ 0.5, 0.75, 0.9, 0.95 ],
method: 'approximate'
}
},
test03_percentiles: {
$percentile: {
input: "$test03",
p: [ 0.5, 0.75, 0.9, 0.95 ],
method: 'approximate'
}
},
test03_percent_alt: {
$percentile: {
input: "$test03",
p: [ 0.9, 0.5, 0.75, 0.95 ],
method: 'approximate'
}
},
}
}
] )

출력:

{
_id: null,
test01_percentiles: [ 62, 64, 67, 67 ],
test02_percentiles: [ 81, 82, 83, 83 ],
test03_percentiles: [ 78, 79, 80, 80 ],
test03_percent_alt: [ 80, 78, 79, 80 ]
}

_id 필드 값은 null이므로 $group은 컬렉션의 모든 문서를 선택합니다.

percentile 축적자는 test01, test02test03의 세 필드에 대한 값을 계산합니다.

축적자는 각 입력 필드에 대해 50번째, 75번째, 90번째 및 95번째 백분위수 값을 계산합니다.

백분위수 값은 p 의 요소와 동일한 순서로 반환됩니다. test03_percentilestest03_percent_alt의 값은 동일하지만 순서가 다릅니다. 각 결과 배열의 요소 순서는 p의 해당 요소 순서와 일치합니다.

$project 단계에서 $percentile은 집계 표현식이며 각 문서의 값을 계산합니다.

$project 단계에서 필드 이름 또는 배열을 입력으로 사용할 수 있습니다.

db.testScores.aggregate( [
{
$project: {
_id: 0,
studentId: 1,
testPercentiles: {
$percentile: {
input: [ "$test01", "$test02", "$test03" ],
p: [ 0.5, 0.95 ],
method: 'approximate'
}
}
}
}
] )

출력:

{ studentId: '2345', testPercentiles: [ 80, 81 ] },
{ studentId: '2356', testPercentiles: [ 79, 83 ] },
{ studentId: '2358', testPercentiles: [ 78, 82 ] },
{ studentId: '2367', testPercentiles: [ 72, 77 ] },
{ studentId: '2369', testPercentiles: [ 60, 72 ] }

$percentile이 집계 표현식인 경우 각 studentId에 대한 결과가 있습니다.

로컬 데이터 추세를 기반으로 백분위수 값을 만들려면 $setWindowField 집계 파이프라인 단계에서 $percentile을 사용합니다.

이 예에서는 점수를 필터링하는 창을 생성합니다.

db.testScores.aggregate( [
{
$setWindowFields: {
sortBy: { test01: 1 },
output: {
test01_95percentile: {
$percentile: {
input: "$test01",
p: [ 0.95 ],
method: 'approximate'
},
window: {
range: [ -3, 3 ]
}
}
}
}
},
{
$project: {
_id: 0,
studentId: 1,
test01_95percentile: 1
}
}
] )

출력:

{ studentId: '2356', test01_95percentile: [ 62 ] },
{ studentId: '2369', test01_95percentile: [ 62 ] },
{ studentId: '2345', test01_95percentile: [ 64 ] },
{ studentId: '2367', test01_95percentile: [ 67 ] },
{ studentId: '2358', test01_95percentile: [ 67 ] }

이 예에서 각 문서의 백분위수 계산에는 앞뒤의 세 문서의 데이터도 통합됩니다.

$median 연산자는 p: [ 0.5 ]의 고정 값을 사용하는 $percentile 연산자의 특수한 경우입니다.

창 함수에 대한 자세한 내용은 $setWindowFields를 참조하세요.

돌아가기

$or