Definición
$percentileNuevo en la versión 7.0.
Devuelve un arreglo de valores escalares que corresponden a los especificados percentile values.
Puedes usar
$percentilecomo un acumulador en la$groupetapa o como una expresión de agregación.
Sintaxis
La sintaxis para $percentile es:
{ $percentile: { input: <expression>, p: [ <expression1>, <expression2>, ... ], method: <string> } }
Campos de comandos
$percentile requiere los siguientes campos:
Campo | Tipo | Necesidad | Descripción |
|---|---|---|---|
| expresión | Requerido |
|
| expresión | Requerido |
|
| String | Requerido | El método que |
Comportamiento
Puede usar $percentile en:
$groupetapas como un acumulador$setWindowFieldsetapas como un acumulador$projectetapas como una expresión de agregación
$percentile tiene las siguientes características como acumulador:
Calcula un único resultado para todos los documentos en la etapa.
Utiliza la t-digest algoritmo para calcular métricas aproximadas basadas en percentiles.
Utiliza métodos aproximados para escalar a grandes volúmenes de datos.
$percentile tiene las siguientes características como expresión de agregación, esta:
Acepta un arreglo como entrada
Calcula un resultado separado para cada documento de entrada
Tipo de operación
En una etapa $group, $percentile es un acumulador y calcula un valor para todos los documentos en la ventana.
En una etapa $project, $percentile es una expresión de agregación y calcula valores para cada documento.
En $setWindowFields etapas, $percentile devuelve un resultado para cada documento como una expresión de agregación, pero los resultados se calculan sobre grupos de documentos como un acumulador.
Consideraciones de cálculo
En las fases $group, $percentile siempre utiliza un método de cálculo aproximado.
En las etapas de $project, $percentile podría usar el método de cálculo discreto incluso cuando se especifica el método aproximado.
En $setWindowFields etapas, la carga de trabajo determina el método de cálculo que usa $percentile.
Los percentiles calculados $percentile que devuelve pueden variar, incluso en los mismos conjuntos de datos. Esto se debe a que el algoritmo calcula valores aproximados.
Las muestras duplicadas pueden causar ambigüedad. Si existe un gran número de duplicados, los valores percentiles pueden no representar la distribución real de la muestra. Considera un conjunto de datos donde todas las muestras son iguales. Todos los valores en el conjunto de datos se encuentran en o por debajo de cualquier percentil. Un valor del "percentil 50" en realidad representaría ya sea el 0 o el 100 por ciento de las muestras.
$percentile devuelve el valor mínimo para p = 0.0.
$percentile devuelve el valor máximo para p = 1.0.
Entrada de arreglo
Si usas $percentile como expresión de agregación en una etapa $project, puedes utilizar un arreglo como entrada. La sintaxis es:
{ $percentile: { input: [ <expression1, <expression2>, .., <expressionN> ], p: [ <expression1>, <expression2>, ... ], method: <string> } }
Funciones de ventana
Una función de ventana permite calcular resultados sobre una "ventana" móvil de documentos vecinos. A medida que cada documento pasa por el pipeline, la $setWindowFields etapa:
Recalcula el conjunto de documentos en la ventana actual
calcula un valor para todos los documentos del conjunto
devuelve un solo valor para ese documento
Puede utilizar $percentile en una etapa $setWindowFields para calcular estadísticas móviles para series de tiempo u otros datos relacionados.
Cuando usas $percentile en una etapa $setWindowField, el valor input debe ser un nombre de campo. Si introduces un arreglo en lugar de un nombre de campo, la operación falla.
Ejemplos
Los siguientes ejemplos utilizan la colección testScores. Crear la colección:
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 } ] )
Calcular un Solo Valor como un Acumulador
Crea un acumulador que calcule un solo valor percentil:
db.testScores.aggregate( [ { $group: { _id: null, test01_percentiles: { $percentile: { input: "$test01", p: [ 0.95 ], method: 'approximate' } }, } } ] )
Salida:
{ _id: null, test01_percentiles: [ 67 ] }
El valor del campo _id es null, por lo que $group selecciona todos los documentos de la colección.
El acumulador percentile toma sus datos de entrada del campo test01.
En este ejemplo, el arreglo de percentiles, p, tiene un valor por lo que el operador $percentile solo calcula un término para los datos test01. El valor percentil 95 es 67.
Calcular valores múltiples como acumulador
Crea un acumulador que calcule múltiples valores percentiles:
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' } }, } } ] )
Salida:
{ _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 ] }
El valor del campo _id es null, por lo que $group selecciona todos los documentos de la colección.
El acumulador percentile calacula valores para tres campos: test01, test02 y test03.
El acumulador calcula los valores del percentil 50, 75, 90 y 95 para cada campo de entrada.
Los valores percentiles se devuelven en el mismo orden que los elementos de p. Los valores en test03_percentiles y test03_percent_alt son los mismos, pero su orden es diferente. El orden de los elementos en cada arreglo de resultados coincide con el orden correspondiente de los elementos en p.
Utiliza $percentile en una $project Etapa
En una etapa $project, $percentile es una expresión de agregación y calcula valores para cada documento.
Se puede utilizar un nombre de campo o un arreglo como entrada en una etapa $project.
db.testScores.aggregate( [ { $project: { _id: 0, studentId: 1, testPercentiles: { $percentile: { input: [ "$test01", "$test02", "$test03" ], p: [ 0.5, 0.95 ], method: 'approximate' } } } } ] )
Salida:
{ 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 ] }
Cuando $percentile es una expresión de agregación, hay un resultado para cada studentId.
Utiliza $percentile en una $setWindowField Etapa
Para basar los valores de percentiles en las tendencias de datos locales, usa $percentile en una etapa del pipeline de agregación $setWindowField.
Este ejemplo crea una ventana para filtrar puntuaciones:
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 } } ] )
Salida:
{ 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 ] }
En este ejemplo, el cálculo del percentil para cada documento también incorpora datos de los tres documentos anteriores y posteriores a él.
Obtén más información
El operador $median es un caso especial del operador $percentile que utiliza un valor fijo de p: [ 0.5 ].
Para más información sobre funciones de ventana, consulte: $setWindowFields.