Definição
$medianNovidades na versão 7.0.
Retorna uma aproximação damediana do , o percentil 50 , como um valor escalar.
Você pode utilizar o
$mediancomo um acumulador na etapa$groupou 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:
$groupestágios como acumulador$setWindowFieldsestágios como acumulador$projectestá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 algoritmo t-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.