Definição
Retorna a média dos valores de uma janela específica.
Observação
Desambiguação
Esta página descreve $avg quando usado como uma função de janela.
Você também pode usar $avg nestes outros contextos:
$avg (accumulator), que retorna um único valor agregado com base em um número variável de documentos de entrada.$avg (expression), que retorna a média dos elementos numéricos em uma array.
Sintaxe
{ $setWindowFields: { ... output: { <field>: { $avg: <expression> } } } }
Comportamento
Tipo de resultado
O tipo de retorno padrão é duplo. Se pelo menos um valor de entrada for um decimal, o tipo de retorno será um decimal.
Valores não numéricos ou ausentes
$avg ignora valores não numéricos, incluindo valores ausentes. Se todos os valores de entrada forem não numéricos, $avg retornará null.
Exemplo
Crie uma collection cakeSales que contenha vendas de bolo nos estados da Califórnia (CA) e de Washington (WA):
db.cakeSales.insertMany( [ { _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"), state: "CA", price: 13, quantity: 120 }, { _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"), state: "WA", price: 14, quantity: 140 }, { _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"), state: "CA", price: 12, quantity: 145 }, { _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"), state: "WA", price: 13, quantity: 104 }, { _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"), state: "CA", price: 41, quantity: 162 }, { _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"), state: "WA", price: 43, quantity: 134 } ] )
Este exemplo utiliza a função de janela $avg para produzir a média móvel para as vendas de bolo quantity para cada state. Para cada estado, adicione um campo a cada documento que contenha a quantidade média do pedido e de todos os pedidos anteriores.
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { averageQuantityForState: { $avg: "$quantity", window: { documents: [ "unbounded", "current" ] } } } } } ] )
A média móvel quantity para CA e WA é mostrada no campoaverageQuantityForState :
[ { _id: 4, type: 'strawberry', orderDate: ISODate('2019-05-18T16:09:01.000Z'), state: 'CA', price: 41, quantity: 162, averageQuantityForState: 162 }, { _id: 0, type: 'chocolate', orderDate: ISODate('2020-05-18T14:10:30.000Z'), state: 'CA', price: 13, quantity: 120, averageQuantityForState: 141 }, { _id: 2, type: 'vanilla', orderDate: ISODate('2021-01-11T06:31:15.000Z'), state: 'CA', price: 12, quantity: 145, averageQuantityForState: 142.33333333333334 }, { _id: 5, type: 'strawberry', orderDate: ISODate('2019-01-08T06:12:03.000Z'), state: 'WA', price: 43, quantity: 134, averageQuantityForState: 134 }, { _id: 3, type: 'vanilla', orderDate: ISODate('2020-02-08T13:13:23.000Z'), state: 'WA', price: 13, quantity: 104, averageQuantityForState: 119 }, { _id: 1, type: 'chocolate', orderDate: ISODate('2021-03-20T11:30:05.000Z'), state: 'WA', price: 14, quantity: 140, averageQuantityForState: 126 } ]
No exemplo anterior:
partitionBy: "$state"particiona os documentos na collection porstate. Existem partições paraCAeWA.sortBy: { orderDate: 1 }classifica os documentos em cada partição pororderDateem ordem crescente (1), para que oorderDatemais antigo seja o primeiro.
outputdefine o campoaverageQuantityForStatecomo a média móvelquantitypara os documentos em uma janela de documentos.A janela contém documentos entre um limite inferior
unboundede o documentocurrentna saída. Isso significa que$avgretorna a média móvel dequantitypara os documentos entre o início da partição e o documento atual (inclusive).