$median (agregação)
Definição
$median
Novidades na versão 7.0.
Retorna uma aproximação damediana do , o percentil 50 , como um valor escalar.
Você pode utilizar o
$median
como um acumulador na etapa$group
ou como uma expressão de escalonamento.
Sintaxe
A sintaxe para $median
é:
{ $median: { input: <number>, method: <string> } }
Campos de comando
$median
usa os seguintes campos:
Campo | Tipo | necessidade | Descrição |
---|---|---|---|
| Expressão | Obrigatório |
|
| String | Obrigatório | O método que o |
Comportamento
Você pode usar $median
em:
$group
estágios como acumulador$setWindowFields
estágios como acumulador$project
estágios como uma expressão de agregação
$median
possui as seguintes características como acumulador, ele:
Calcula um único resultado para todos os documentos no estágio.
Usa o algoritmot-digest para calcular métricas aproximadas baseadas em percentil.
Usa métodos aproximados para dimensionar grandes volumes de dados.
$median
tem as seguintes características como uma expressão de agregação, ela:
Aceita uma array como entrada
Calcula um resultado separado para cada documento de entrada
Tipo de operação
Em uma etapa $group
, $median
é um acumulador e calcula um valor para todos os documentos na janela.
Em uma etapa $project
, $median
é uma expressão de agregação e calcula valores para cada documento.
Em $setWindowFields
etapas, o $median
retorna um resultado para cada documento como uma expressão de agregação, mas os resultados são calculados sobre grupos de documentos como um acumulador.
Considerações de cálculo
Em $group
estágios, o $median
sempre utiliza um método de cálculo aproximado.
Em $project
estágios, o $median
pode utilizar o método de cálculo discreto mesmo quando o método aproximado é especificado.
Em $setWindowFields
estágios, a carga de trabalho determina o método de cálculo que o $median
utiliza.
Os retornos $median
dos percentis calculados podem variar, mesmo nos mesmos conjuntos de dados. Isso ocorre porque o algoritmo calcula valores aproximados.
Amostras duplicadas podem causar ambiguidade. Se houver um grande número de duplicatas, os valores percentuais poderão não representar a distribuição real da amostra. Considere um conjunto de dados onde todas as amostras são as mesmas. Todos os valores no conjunto de dados ficam iguais ou abaixo de qualquer percentil. Um valor do "50º percentil" representaria, na verdade, 0 ou 100 por cento das amostras.
Entrada de array
Se você usar $median
como expressão de agregação em um estágio $project
, poderá usar uma array como entrada. $median
ignora os valores não numéricos da array.
A sintaxe é:
{ $median: { input: [ <expression1, <expression2>, ..., <expressionN> ], method: <string> } }
Funções de janela
Uma função de janela permite calcular os resultados em uma "janela" móvel de documentos vizinhos. Conforme cada documento passa pelo pipeline, a etapa $setWindowFields
:
Recompute o conjunto de documentos na janela atual
calcula um valor para todos os documentos no conjunto
retorna um único valor para esse documento
Você pode usar $median
em um estágio $setWindowFields
para calcular estatísticas contínuas para séries temporais ou outros dados relacionados.
Quando você utiliza $median
em uma etapa $setWindowField
, o valor input
deve ser um nome de campo. Se você inserir uma array em vez de um nome de campo, a operação falhará.
Exemplos
Os exemplos a seguir usam a collection testScores
. Criar a collection:
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 } ] )
Use $median
como acumulador
Crie um acumulador que calcule o valor mediano:
db.testScores.aggregate( [ { $group: { _id: null, test01_median: { $median: { input: "$test01", method: 'approximate' } } } } ] )
Saída:
{ _id: null, test01_median: 62 }
O valor do campo _id
é null
, portanto, $group
seleciona todos os documentos na coleção.
O acumulador do $median
obtém sua saída a partir do campo test01
. $median
calcula o valor mediano para o campo, que é 62
neste exemplo.
Usar $median
em um $project
estágio
Em um estágio $group
, $median
é um acumulador e calcula um único valor para todos os documentos. Em um estágio $project
, $median
é uma expressão de agregação e calcula valores para cada documento.
Você pode utilizar um nome de campo ou uma array como entrada em um estágio $project
.
db.testScores.aggregate( [ { $project: { _id: 0, studentId: 1, testMedians: { $median: { input: [ "$test01", "$test02", "$test03" ], method: 'approximate' } } } } ] )
Saída:
{ studentId: '2345', testMedians: 80 }, { studentId: '2356', testMedians: 79 }, { studentId: '2358', testMedians: 78 }, { studentId: '2367', testMedians: 72 }, { studentId: '2369', testMedians: 60 }
Quando $median
é uma expressão de agregação há um resultado para cada studentId
.
Usar $median
em um $setWindowField
estágio
Para basear seus valores de percentil em tendências de dados locais, use $median
em um estágio de aggregation pipeline de $setWindowField
.
Este exemplo cria uma janela para filtrar pontuações:
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 } } ] )
Saída:
{ 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 }
Neste exemplo, o cálculo da mediana de cada documento também incorpora dados dos três documentos antes e depois dele.
Saiba mais
O operador $percentile
é uma versão mais geral do operador $median
e permite definir um ou mais valores percentuais.
Para mais informações sobre funções da janela, consulte: $setWindowFields
.