Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

$percentile (operador de acumulación)

$percentile

Nuevo en la versión 7.0.

Devuelve un arreglo de valores escalares que corresponden a los especificados percentile values.

Puede utilizar $percentile como acumulador en la etapa o como una $group expresiónde agregación.

La sintaxis para $percentile es:

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

$percentile requiere los siguientes campos:

Campo
Tipo
Necesidad
Descripción

input

expresión

Requerido

$percentile calcula los valores percentiles de estos datos. input debe ser un nombre de campo o una expresión que se evalúe como un tipo numérico. Si la expresión no se puede convertir en un tipo numérico, el cálculo de $percentile la ignora.

p

expresión

Requerido

$percentile Calcula un valor percentil para cada elemento en p. Los elementos representan porcentajes y deben evaluarse como valores numéricos en el rango de 0.0 a 1.0, ambos inclusive.

$percentile devuelve resultados en el mismo orden que los elementos en p.

method

String

Requerido

El método que mongod utiliza para calcular el valor percentil. El método debe ser 'approximate'.

Puede usar $percentile en:

  • $group etapas como un acumulador

  • $setWindowFields etapas como un acumulador

  • $project etapas 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:

  • Acepta un arreglo como entrada

  • Calcula un resultado separado para cada documento de entrada

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.

En las fases $group, $percentile siempre utiliza un método de cálculo aproximado.

En $project etapas, $percentile 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 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 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 o por debajo de cualquier percentil. Un valor de "percentil 50" representaría en realidad el 0 % o el 100 % de las muestras.

$percentile devuelve el valor mínimo para p = 0.0.

$percentile devuelve el valor máximo para p = 1.0.

Si usa $percentile como expresión de agregación en una etapa, puede usar una matriz como entrada. La sintaxis $project es:

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

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 $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.

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 }
] )

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, la matriz de percentiles, p, tiene un solo valor, por lo que el operador $percentile solo calcula un término para los datos test01. El valor del percentil 95 es 67.

Cree un acumulador que calcule múltiples valores de percentil:

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 de percentil se devuelven en el mismo orden que los elementos de p. Los valores de test03_percentiles y test03_percent_alt son iguales, pero su orden es diferente. El orden de los elementos en cada matriz de resultados coincide con el orden correspondiente de los elementos en p.

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.

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.

El operador es un caso especial $median del $percentile operador que utiliza un valor fijo p: [ 0.5 ] de.

Para más información sobre funciones de ventana, consulte: $setWindowFields.

Volver

$minN

En esta página