No MongoDB, o
$avg o operador de pipeline de agregação calcula e retorna o valor médio dos valores numéricos especificados. Sintaxe
O
$avg O operador suporta duas sintaxes. Sintaxe 1:
{ $avg: <expression> } Sintaxe 2:
{ $avg: [ <expression1>, <expression2> ... ] } A primeira sintaxe aceita um argumento e a segunda sintaxe aceita vários argumentos.
Quando usado no
$group stage, você só pode usar a primeira sintaxe. Neste caso, $avg retorna a média coletiva de todos os valores numéricos resultantes da aplicação de uma expressão especificada a cada documento em um grupo de documentos que compartilham o mesmo grupo por chave. Exemplos de sintaxe 1 (argumento único)
Aqui estão alguns exemplos que usam a sintaxe 1.
Documentos agrupados
Este exemplo usa
$avg em conjunto com $group para retornar a média em um grupo de documentos agrupados por chave. Suponha que tenhamos uma coleção chamada
pets com os seguintes documentos:{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Latido", "tipo" :"Dog", "weight" :10 }{ "_id" :3, "name" :"Miau", "type" :"Cat", "weight" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Canguru", "weight" :100 }{ " _id" :6, "name" :"Hop", "type" :"Canguru", "peso" :130 }{ "_id" :7, "name" :"Punch", "type" :"Canguru", "weight" :200 }{ "_id" :8, "name" :"Snap", "type" :"Gato", "weight" :12 }{ "_id" :9, "name" :"Ruff", "type" :"Cão", "peso" :30 } Podemos agrupar esses documentos por seu
type campo e, em seguida, use $avg para retornar o peso médio de cada grupo:db.pets.aggregate(
[
{
$group:
{
_id: "$type",
average_weight: { $avg: "$weight" }
}
}
]
) Resultado:
{ "_id" :"Cachorro", "average_weight" :20 }{ "_id" :"Gato", "average_weight" :9 }{ "_id" :"Canguru", "average_weight" :143.33333333333334 } Matrizes
Este exemplo se aplica a $avg para um único documento que contém um campo com uma matriz de valores.
Esta opção só está disponível ao usar a sintaxe de argumento único. As matrizes são ignoradas ao usar a sintaxe de vários argumentos (mais sobre isso abaixo).
Suponha que tenhamos uma coleção chamada players com os seguintes documentos:
{ "_id" :1, "player" :"Homer", "scores" :[ 1, 7, 2, 3, 8, 7, 1 ] }{ "_id" :2, "player" :" Marge", "scores" :[ 0, 1, 8, 17, 18, 8 ] }{ "_id" :3, "player" :"Bart", "scores" :[ 15, 11, 8, 0, 1 , 3 ] }{ "_id" :4, "player" :"Brian", "scores" :[ 7 ] }{ "_id" :5, "player" :"Farnsworth", "scores" :[ ] }{ "_id" :6, "player" :"Meg", "scores" :null }{ "_id" :7, "player" :"Ron" }
Podemos aplicar $avg para as scores campo em cada documento:
db.players.aggregate(
[
{
$project:
{
player: 1,
averageScore: { $avg: "$scores" }
}
}
]
)
Resultado:
{ "_id" :1, "player" :"Homer", "averageScore" :4.142857142857143 }{ "_id" :2, "player" :"Marge", "averageScore" :8.666666666666666 }{ "_id" :3, "player" :"Bart", "averageScore" :6.333333333333333 }{ "_id" :4, "player" :"Brian", "averageScore" :7 }{ "_id" :5, "player" :"Farnsworth ", "averageScore" :null }{ "_id" :6, "player" :"Meg", "averageScore" :null }{ "_id" :7, "player" :"Ron", "averageScore" :null }
Nesse caso, os quatro primeiros documentos retornaram a média dos diversos números que estavam em suas respectivas matrizes.
No caso do documento 4, era o mesmo que o número, pois havia apenas um número no array.
O documento 5 retornou null porque fornecemos um array vazio.
O documento 6 retornou null porque fornecemos null como o argumento.
O documento 7 retornou null porque o campo nem existia.
Exemplo de sintaxe 2 (vários argumentos)
A segunda sintaxe envolve fornecer $avg com mais de um argumento. $avg em seguida, calcula a média com base em todos os argumentos fornecidos.
Suponha que tenhamos uma coleção chamada data com os seguintes documentos:
{ "_id":1, "a":1, "b":2, "c":3, "d":4 }{ "_id":2, "a":1, "b" :2, "c" :3, "d" :[ 4 ] }{ "_id" :3, "a" :1, "b" :2, "c" :3, "d" :"Ei" } { "_id" :4, "a" :"Um", "b" :"Dois", "c" :"Três", "d" :"Quatro" }
Podemos usar $avg para retornar a média do a , b , c e d campos de cada documento:
db.data.aggregate(
[
{
$project:
{
avg: { $avg: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Resultado:
{ "_id" :1, "média" :2.5 }{ "_id" :2, "média" :2 }{ "_id" :3, "média" :2 }{ "_id" :4, " avg" :null }
O documento 1 retorna a média dos valores de entrada de 1 , 2 , 3 e 4 .
No entanto, os próximos dois documentos retornaram apenas a média dos valores de entrada de 1 , 2 e 3 . O $avg operador ignorou seu d Campos.
Isso ocorre porque $avg ignora valores não numéricos. Então, neste caso, ele ignorou "Hey" no documento 3 e calculou a média dos demais campos (numéricos).
Quanto ao documento 2, seu d campo contém uma matriz. Como mencionado, o $avg O operador ignora matrizes ao usar a sintaxe de vários argumentos. Mais precisamente, trata arrays como valores não numéricos quando usados neste contexto, e $avg ignora valores não numéricos.
Se todos os valores não forem numéricos, então $avg retorna null . Podemos ver isso com o documento 4.
Campos ausentes
Ao usar a sintaxe de vários argumentos, $avg ignora quaisquer campos ausentes. Ou seja, se você fornecer um campo que não existe, ele o ignora. Se nenhum dos campos existir, ele retornará null .
Exemplo:
db.data.aggregate(
[
{
$project:
{
avg: { $avg: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
Resultado:
{ "_id" :1, "média" :2.5 }{ "_id" :2, "média" :2 }{ "_id" :3, "média" :2 }{ "_id" :4, " avg" :null }
Neste caso forneci um campo extra ($e ) que não existe nos documentos. $avg calculou a média com base nos campos restantes que fazem existir.
No entanto, veja o que acontece quando nenhum dos campos existem:
db.data.aggregate(
[
{
$project:
{
result: { $avg: [ "$x", "$y", "$z" ] }
}
}
]
)
Resultado:
{ "_id" :1, "resultado" :null }{ "_id" :2, "resultado" :null }{ "_id" :3, "resultado" :null }{ "_id" :4, " resultado" :null }
O resultado é null para todos os documentos.
Como vimos anteriormente, ao usar a sintaxe de argumento único, um campo ausente resulta em null .
Exemplo:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
avg: { $avg: "$oops!" }
}
}
]
)
Resultado:
{ "_id" :"Canguru", "avg" :null }{ "_id" :"Gato", "avg" :null }{ "_id" :"Cachorro", "avg" :null } Etapas disponíveis
$avg está disponível nas seguintes etapas:
$group$project$addFields$set$replaceRoot$replaceWith$matchestágio que inclui um$exprexpressão