Definición
Cambiado en la versión 5.0.
Devuelve el valor promedio de los valores numéricos. $avg ignora los valores no numéricos.
$avg está disponible en estas etapas:
$setWindowFields(Disponible a partir de MongoDB 5.0)
Sintaxis
Cuando se utiliza en las $bucket $bucketAuto$group $setWindowFields etapas,, y, tiene esta$avg sintaxis:
{ $avg: <expression> }
Cuando se utiliza en otras etapas compatibles, tiene una de dos$avg sintaxis:
$avgtiene una expresión especificada como su operando:{ $avg: <expression> } $avgtiene una lista de expresiones especificadas como su operando:{ $avg: [ <expression1>, <expression2> ... ] }
Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
Tipo de resultado
El tipo de retorno por defecto es un double. Si al menos un operando es un decimal, entonces el tipo de retorno es un decimal.
Valores no numéricos o faltantes
$avg ignora los valores no numéricos, incluidos los valores faltantes. Si todos los operandos para el promedio no son numéricos, $avg devuelve null ya que el promedio de valores cero no está definido.
Arreglo Operand
En la etapa, si la expresión $group $avg se resuelve en una matriz, trata el operando como un valor no numérico.
En las otras etapas admitidas:
Con una sola expresión como operando, si la expresión se resuelve en una matriz, recorre la matriz para operar sobre los elementos numéricos de la matriz para devolver un único
$avgvalor.Con una lista de expresiones como operando, si alguna de las expresiones se resuelve en una matriz,no recorre
$avgla matriz, sino que trata la matriz como un valor no numérico.
Ejemplos
Uso en la etapa $group
Considera una colección sales con los siguientes documentos:
db.sales.insertMany( [ { _id : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:00:00Z") }, { _id : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-02-03T09:00:00Z") }, { _id : 3, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-03T09:05:00Z") }, { _id : 4, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-02-15T08:00:00Z") }, { _id : 5, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T09:12:00Z") } ] )
Agrupando los documentos por el item campo, la siguiente operación utiliza el acumulador para calcular la cantidad promedio y la cantidad promedio para cada $avg agrupación.
db.sales.aggregate( [ { $group: { _id: "$item", avgAmount: { $avg: { $multiply: [ "$price", "$quantity" ] } }, avgQuantity: { $avg: "$quantity" } } } ] )
La operación devuelve los siguientes resultados:
{ "_id" : "xyz", "avgAmount" : 37.5, "avgQuantity" : 7.5 } { "_id" : "jkl", "avgAmount" : 20, "avgQuantity" : 1 } { "_id" : "abc", "avgAmount" : 60, "avgQuantity" : 6 }
Uso en la etapa $project
Una colección students contiene los siguientes documentos:
{ "_id": 1, "quizzes": [ 10, 6, 7 ], "labs": [ 5, 8 ], "final": 80, "midterm": 75 } { "_id": 2, "quizzes": [ 9, 10 ], "labs": [ 8, 8 ], "final": 95, "midterm": 80 } { "_id": 3, "quizzes": [ 4, 5, 5 ], "labs": [ 6, 5 ], "final": 78, "midterm": 70 }
El siguiente ejemplo utiliza el $avg en la etapa para calcular el promedio de las calificaciones de los cuestionarios, el promedio de las calificaciones de los laboratorios y el promedio del examen final y el examen $project parcial:
db.students.aggregate([ { $project: { quizAvg: { $avg: "$quizzes"}, labAvg: { $avg: "$labs" }, examAvg: { $avg: [ "$final", "$midterm" ] } } } ])
La operación da como resultado los siguientes documentos:
{ "_id" : 1, "quizAvg" : 7.666666666666667, "labAvg" : 6.5, "examAvg" : 77.5 } { "_id" : 2, "quizAvg" : 9.5, "labAvg" : 8, "examAvg" : 87.5 } { "_id" : 3, "quizAvg" : 4.666666666666667, "labAvg" : 5.5, "examAvg" : 74 }
Uso en la etapa $setWindowFields
Nuevo en la versión 5.0.
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 $avg en la etapa para generar el promedio móvil de las ventas de $setWindowFields pasteles quantity para state cada:
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { averageQuantityForState: { $avg: "$quantity", window: { documents: [ "unbounded", "current" ] } } } } } ] )
En el ejemplo:
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 elaverageQuantityForStatecampo al promedioquantitymóvil usando para los documentos en una$avgventana de documentos.La ventana contiene documentos entre un
unboundedlímite inferior y elcurrentdocumento en la salida. Esto significa que$avgdevuelve la mediaquantitymóvil para los documentos entre el inicio de la partición y el documento actual.
En esta salida, el promedio móvil quantity para CA y WA se muestra en el campo averageQuantityForState:
{ "_id" : 4, "type" : "strawberry", "orderDate" : ISODate("2019-05-18T16:09:01Z"), "state" : "CA", "price" : 41, "quantity" : 162, "averageQuantityForState" : 162 } { "_id" : 0, "type" : "chocolate", "orderDate" : ISODate("2020-05-18T14:10:30Z"), "state" : "CA", "price" : 13, "quantity" : 120, "averageQuantityForState" : 141 } { "_id" : 2, "type" : "vanilla", "orderDate" : ISODate("2021-01-11T06:31:15Z"), "state" : "CA", "price" : 12, "quantity" : 145, "averageQuantityForState" : 142.33333333333334 } { "_id" : 5, "type" : "strawberry", "orderDate" : ISODate("2019-01-08T06:12:03Z"), "state" : "WA", "price" : 43, "quantity" : 134, "averageQuantityForState" : 134 } { "_id" : 3, "type" : "vanilla", "orderDate" : ISODate("2020-02-08T13:13:23Z"), "state" : "WA", "price" : 13, "quantity" : 104, "averageQuantityForState" : 119 } { "_id" : 1, "type" : "chocolate", "orderDate" : ISODate("2021-03-20T11:30:05Z"), "state" : "WA", "price" : 14, "quantity" : 140, "averageQuantityForState" : 126 }