Definición
$medianNuevo en la versión 7.0.
Devuelve una aproximación de la mediana, el 50 percentil, como valor escalar.
Puede utilizar
$mediancomo acumulador en la etapa o como una$groupexpresiónde agregación.
Sintaxis
La sintaxis para $median es:
{ $median: { input: <number>, method: <string> } }
Campos de comandos
$median toma los siguientes campos:
Campo | Tipo | Necesidad | Descripción |
|---|---|---|---|
| expresión | Requerido |
|
| String | Requerido | El método que |
Comportamiento
Puedes utilizar $median en:
$groupetapas como acumulador$setWindowFieldsetapas como acumulador$projectetapas como expresión de agregación
$median Tiene las siguientes características como acumulador:
Calcula un único resultado para todos los documentos en la etapa.
Utiliza el t-digest Algoritmo para calcular métricas aproximadas basadas en percentiles.
Utiliza métodos aproximados para escalar grandes volúmenes de datos.
$median Tiene las siguientes características como expresión de agregación:
Acepta una matriz como entrada
Calcula un resultado separado para cada documento de entrada
Tipo de operación
En una etapa $group, $median es un acumulador y calcula un valor para todos los documentos en la ventana.
En una etapa $project, $median es una expresión de agregación y calcula valores para cada documento.
En $setWindowFields etapas, $median 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, $median siempre utiliza un método de cálculo aproximado.
En $project etapas, $median podría utilizar 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 utiliza $median.
Los percentiles $median calculados 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 hay una gran cantidad de duplicados, los valores percentiles podrían no representar la distribución muestral real. Considere un conjunto de datos donde todas las muestras son iguales. Todos los valores del conjunto de datos se encuentran en cualquier percentil o por debajo de él. Un valor de "percentil 50" representaría en realidad el 0 o el 100 por ciento de las muestras.
Entrada de matriz
Si utiliza $median como expresión de agregación en una etapa, puede usar una matriz como $project entrada. $median ignora los valores de matriz no numéricos.
La sintaxis es:
{ $median: { input: [ <expression1, <expression2>, ..., <expressionN> ], method: <string> } }
Funciones de ventana
Una función de ventana permite calcular resultados sobre una ventana móvil de documentos adyacentes. A medida que cada documento pasa por la canalización, la $setWindowFields etapa:
Recalcula el conjunto de documentos en la ventana actual
Calcula un valor para todos los documentos del conjunto
devuelve un único valor para ese documento
Puede utilizar $median en una $setWindowFields etapa para calcular estadísticas móviles para series de tiempo u otros datos relacionados.
Cuando usas $median 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 } ] )
使用 $median 作为acumulador
Crea un acumulador que calcule el valor mediano:
db.testScores.aggregate( [ { $group: { _id: null, test01_median: { $median: { input: "$test01", method: 'approximate' } } } } ] )
Salida:
{ _id: null, test01_median: 62 }
El valor del campo _id es null, por lo que $group selecciona todos los documentos de la colección.
El acumulador $median toma su entrada del campo test01. $median calcula el valor mediano del campo, 62 en este ejemplo.
Utilice $median en una $project etapa
En una etapa $group, $median es un acumulador y calcula un único valor para todos los documentos. En una etapa $project, $median es una expresión de agregación y calcula valores para cada documento.
Puede utilizar un nombre de campo o una matriz como entrada en una etapa $project.
db.testScores.aggregate( [ { $project: { _id: 0, studentId: 1, testMedians: { $median: { input: [ "$test01", "$test02", "$test03" ], method: 'approximate' } } } } ] )
Salida:
{ studentId: '2345', testMedians: 80 }, { studentId: '2356', testMedians: 79 }, { studentId: '2358', testMedians: 78 }, { studentId: '2367', testMedians: 72 }, { studentId: '2369', testMedians: 60 }
Cuando $median es una expresión de agregación, hay un resultado para cada studentId.
Utilice $median en una $setWindowField etapa
Para basar sus valores de percentil en las tendencias de datos locales, utilice $median en una etapa de canalización de agregación $setWindowField.
Este ejemplo crea una ventana para filtrar puntuaciones:
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 } } ] )
Salida:
{ 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 }
En este ejemplo, el cálculo de la mediana de cada documento también incorpora datos de los tres documentos anteriores y posteriores.
Obtén más información
El operador es una versión más general $percentile del $median operador que le permite establecer uno o más valores de percentil.
Para obtener más información sobre las funciones de ventana, $setWindowFields consulte:.