Definición
Devuelve el promedio de los valores de una ventana determinada.
Nota
Desambiguación
Esta página describe $avg cuando se utiliza como función de ventana.
También puedes usar $avg en estos otros contextos:
$avg (accumulator), que devuelve un único valor agregado basado en un número variable de documentos de entrada.$avg (expression), que devuelve el promedio de los elementos numéricos en una matriz.
Sintaxis
{ $setWindowFields: { ... output: { <field>: { $avg: <expression> } } } }
Comportamiento
Tipo de resultado
El tipo de retorno predeterminado es double. Si al menos un valor de entrada es decimal, el tipo de retorno también será decimal.
Valores no numéricos o faltantes
$avg Ignora los valores no numéricos, incluidos los valores faltantes. Si todos los valores de entrada no son numéricos, $avg devuelve null.
Ejemplo
Crea una colección de cakeSales que incluya ventas de pasteles en el estado de California (CA) y 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 ejemplo utiliza la función de ventana $avg para generar el promedio móvil de las ventas de pasteles quantity para cada state. Para cada estado, agregue un campo a cada documento que contenga la cantidad promedio del pedido y de todos los pedidos anteriores.
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { averageQuantityForState: { $avg: "$quantity", window: { documents: [ "unbounded", "current" ] } } } } } ] )
La media móvil quantity para CA y WA se muestra en el campo averageQuantityForState:
[ { _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 } ]
En el ejemplo precedente:
partitionBy: "$state"particiona los documentos de la colección enstate. Existen particiones paraCAyWA.sortBy: { orderDate: 1 }ordena los documentos de cada partición pororderDateen orden ascendente (1), de modo que elorderDatemás antiguo sea el primero.
outputEstablece el campoaverageQuantityForStateal promedio móvilquantitypara los documentos en una ventana de documentos.La ventana contiene documentos entre un límite inferior
unboundedy el documentocurrenten la salida. Esto significa que$avgdevuelve la media móvil dequantitypara los documentos entre el inicio de la partición y el documento actual (inclusive).