I MongoDB, $avg
aggregeringspipeline-operatören beräknar och returnerar medelvärdet för de angivna numeriska värdena.
Syntax
$avg
operatorn stöder två syntaxer.
Syntax 1:
{ $avg: <expression> }
Syntax 2:
{ $avg: [ <expression1>, <expression2> ... ] }
Den första syntaxen accepterar ett argument och den andra syntaxen accepterar flera argument.
När den används i $group
steg kan du bara använda den första syntaxen. I det här fallet, $avg
returnerar det kollektiva medelvärdet av alla numeriska värden som är resultatet av att tillämpa ett specificerat uttryck på varje dokument i en grupp av dokument som delar samma grupp efter nyckel.
Exempel på syntax 1 (enkelt argument)
Här är ett par exempel som använder syntax 1.
Grupperade dokument
Det här exemplet använder $avg
i samband med $group
för att returnera genomsnittet för en grupp av dokument som är grupperade efter nyckel.
Anta att vi har en samling som heter pets
med följande dokument:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "typ" :"Hund", "vikt" :10 }{ "_id" :3, "name" :"Mjau", "typ" :"Katt", "vikt" :7 }{ "_id" :4, "namn" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Känguru", "weight" :100 }{ " _id" :6, "name" :"Hop", "type" :"Känguru", "vikt" :130 }{ "_id" :7, "name" :"Punch", "type" :"Känguru", "weight" :200 }{ "_id" :8, "name" :"Snap", "type" :"Cat", "weight" :12 }{ "_id" :9, "name" :"Ruff", "type" :"Hund", "vikt" :30 }
Vi kan gruppera dessa dokument efter deras type
och använd sedan $avg
för att returnera medelvikten för varje grupp:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
average_weight: { $avg: "$weight" }
}
}
]
)
Resultat:
{ "_id" :"Hund", "average_weight" :20 }{ "_id" :"Katt", "average_weight" :9 }{ "_id" :"Känguru", "average_weight" :143.333333333333334 }Arrayer
Det här exemplet gäller
$avg
till ett enda dokument som innehåller ett fält med en rad värden.Det här alternativet är endast tillgängligt när du använder syntaxen för enstaka argument. Matriser ignoreras när man använder flerargumentsyntaxen (mer om detta nedan).
Anta att vi har en samling som heter
players
med följande dokument:{ "_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" }Vi kan använda
$avg
tillscores
fält i varje dokument:db.players.aggregate( [ { $project: { player: 1, averageScore: { $avg: "$scores" } } } ] )
Resultat:
{ "_id" :1, "player" :"Homer", "averageScore" :4.142857142857143 }{ "_id" :2, "player" :"Marge", "averageScore" :8.6666666666 :}{6666 3, "player" :"Bart", "averageScore" :6,33333333333333333 }{ "_id" :4, "player" :"Brian", "averageScore" :7 }{ "_id" :5, "player" :"Farnsworth ", "averageScore" :null }{ "_id" :6, "player" :"Meg", "averageScore" :null }{ "_id" :7, "player" :"Ron", "averageScore" :null }I det här fallet returnerade de första fyra dokumenten genomsnittet av de olika siffrorna som fanns i sina respektive arrayer.
I dokument 4:s fall var detta detsamma som numret, eftersom det bara fanns ett nummer i arrayen.
Dokument 5 returnerade
null
eftersom vi tillhandahållit en tom array.Dokument 6 returnerade
null
eftersom vi tillhandahållitnull
som argument.Dokument 7 returnerade
null
eftersom fältet inte ens existerade.Exempel på syntax 2 (flera argument)
Den andra syntaxen innebär att du tillhandahåller
$avg
med mer än ett argument.$avg
beräknar sedan genomsnittet baserat på alla angivna argument.Anta att vi har en samling som heter
data
med följande dokument:{ "_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" :"Hej" } { "_id" :4, "a" :"En", "b" :"Två", "c" :"Tre", "d" :"Fyra" }Vi kan använda
$avg
för att returnera medelvärdet ava
,b
,c
ochd
fält för varje dokument:db.data.aggregate( [ { $project: { avg: { $avg: [ "$a", "$b", "$c", "$d" ] } } } ] )
Resultat:
{ "_id" :1, "avg" :2.5 }{ "_id" :2, "avg" :2 }{ "_id" :3, "avg" :2 }{ "_id" :4, " avg" :null }Dokument 1 returnerar medelvärdet av ingångsvärdena för
1
,2
,3
och4
.De följande två dokumenten returnerade dock bara medelvärdet av ingångsvärdena för
1
,2
och3
.$avg
operatören ignorerade derasd
fält.Detta beror på att
$avg
ignorerar icke-numeriska värden. Så i det här fallet ignorerade den"Hey"
i dokument 3 och beräknade medelvärdet från de återstående (numeriska) fälten.När det gäller dokument 2, dess
d
fältet innehåller en array. Som nämnts,$avg
operatorn ignorerar matriser när syntaxen för flera argument används. Mer exakt behandlar den arrayer som icke-numeriska värden när de används i detta sammanhang, och$avg
ignorerar icke-numeriska värden.Om alla värden är icke-numeriska, då
$avg
returnerarnull
. Vi kan se detta med dokument 4.Fält saknas
När du använder syntaxen för flera argument,
$avg
ignorerar eventuella saknade fält. Det vill säga, om du anger ett fält som inte finns ignorerar det det. Om inget av fälten finns returnerar detnull
.Exempel:
db.data.aggregate( [ { $project: { avg: { $avg: [ "$a", "$b", "$c", "$d", "$e" ] } } } ] )
Resultat:
{ "_id" :1, "avg" :2.5 }{ "_id" :2, "avg" :2 }{ "_id" :3, "avg" :2 }{ "_id" :4, " avg" :null }I det här fallet angav jag ett extra fält (
$e
) som inte finns i dokumenten.$avg
beräknade genomsnittet baserat på de återstående fälten som gör finns.Men här är vad som händer när ingen av fälten finns:
db.data.aggregate( [ { $project: { result: { $avg: [ "$x", "$y", "$z" ] } } } ] )
Resultat:
{ "_id" :1, "result" :null }{ "_id" :2, "result" :null }{ "_id" :3, "result" :null }{ "_id" :4, " resultat" :null }Resultatet är
null
för alla dokument.Som vi såg tidigare, när du använder syntaxen med ett argument, resulterar ett saknat fält i
null
.Exempel:
db.pets.aggregate( [ { $group: { _id: "$type", avg: { $avg: "$oops!" } } } ] )
Resultat:
{ "_id" :"Känguru", "avg" :null }{ "_id" :"Katt", "avg" :null }{ "_id" :"Hund", "avg" :null }Tillgängliga steg
$avg
är tillgänglig i följande steg:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
steg som inkluderar en$expr
uttryck