I MongoDB er $avg
aggregeringspipeline-operatør beregner og returnerer gennemsnitsværdien af de angivne numeriske værdier.
Syntaks
$avg
operatoren understøtter to syntakser.
Syntaks 1:
{ $avg: <expression> }
Syntaks 2:
{ $avg: [ <expression1>, <expression2> ... ] }
Den første syntaks accepterer ét argument, og den anden syntaks accepterer flere argumenter.
Når det bruges i $group
fase, kan du kun bruge den første syntaks. I dette tilfælde $avg
returnerer det kollektive gennemsnit af alle de numeriske værdier, der er resultatet af at anvende et specificeret udtryk på hvert dokument i en gruppe af dokumenter, der deler den samme gruppe efter nøgle.
Eksempler på syntaks 1 (enkelt argument)
Her er et par eksempler, der bruger syntaks 1.
Grupperte dokumenter
Dette eksempel bruger $avg
i forbindelse med $group
for at returnere gennemsnittet på tværs af en gruppe dokumenter, der er grupperet efter nøgle.
Antag, at vi har en samling kaldet pets
med følgende dokumenter:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Hund", "vægt" :10 }{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :4, "navn" :"Scratch", "type" :"Kat", "vægt" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Kænguru", "vægt" :100 }{ " _id" :6, "name" :"Hop", "type" :"Kænguru", "vægt" :130 }{ "_id" :7, "name" :"Punch", "type" :"Kænguru", "vægt" :200 }{ "_id" :8, "name" :"Snap", "type" :"Kat", "vægt" :12 }{ "_id" :9, "name" :"Ruff", "type" :"Hund", "vægt" :30 }
Vi kan gruppere disse dokumenter efter deres type
felt, og brug derefter $avg
for at returnere gennemsnitsvægten for hver gruppe:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
average_weight: { $avg: "$weight" }
}
}
]
)
Resultat:
{ "_id" :"Hund", "average_weight" :20 }{ "_id" :"Kat", "average_weight" :9 }{ "_id" :"Kænguru", "average_weight" :143.333333333333334 }Arrays
Dette eksempel gælder
$avg
til et enkelt dokument, der indeholder et felt med en række værdier.Denne indstilling er kun tilgængelig, når du bruger syntaksen for enkelt argument. Arrays ignoreres, når du bruger multi-argument-syntaksen (mere om dette nedenfor).
Antag, at vi har en samling kaldet
players
med følgende dokumenter:{ "_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 anvende
$avg
tilscores
felt i hvert 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.3333333333333333 }{ "_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 dette tilfælde returnerede de første fire dokumenter gennemsnittet af de forskellige tal, der var i deres respektive arrays.
I dokument 4s tilfælde var dette det samme som nummeret, fordi der kun var ét tal i arrayet.
Dokument 5 returnerede
null
fordi vi leverede et tomt array.Dokument 6 returnerede
null
fordi vi har leveretnull
som argumentet.Dokument 7 returnerede
null
fordi feltet ikke engang eksisterede.Eksempel på syntaks 2 (flere argumenter)
Den anden syntaks involverer at give
$avg
med mere end ét argument.$avg
beregner derefter gennemsnittet baseret på alle de leverede argumenter.Antag, at vi har en samling kaldet
data
med følgende dokumenter:{ "_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" :"Én", "b" :"To", "c" :"Tre", "d" :"Fire" }Vi kan bruge
$avg
for at returnere gennemsnittet afa
,b
,c
ogd
felter i hvert 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 returnerer gennemsnittet af inputværdierne for
1
,2
,3
og4
.De næste to dokumenter returnerede dog kun gennemsnittet af inputværdierne for
1
,2
og3
.$avg
operatør ignorerede deresd
felter.Dette er fordi
$avg
ignorerer ikke-numeriske værdier. Så i dette tilfælde ignorerede den"Hey"
i dokument 3 og beregnede gennemsnittet ud fra de resterende (numeriske) felter.Hvad angår dokument 2, er dets
d
felt indeholder en matrix. Som nævnt er$avg
operatør ignorerer arrays, når der bruges multi-argument syntaks. Mere præcist behandler den arrays som ikke-numeriske værdier, når de bruges i denne sammenhæng, og$avg
ignorerer ikke-numeriske værdier.Hvis alle værdier er ikke-numeriske, så
$avg
returnerernull
. Det kan vi se med dokument 4.Manglende felter
Når du bruger multi-argument-syntaksen,
$avg
ignorerer eventuelle manglende felter. Det vil sige, at hvis du angiver et felt, der ikke eksisterer, ignorerer det det. Hvis ingen af felterne eksisterer, returnerer detnull
.Eksempel:
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 dette tilfælde har jeg angivet et ekstra felt (
$e
), som ikke findes i dokumenterne.$avg
beregnede gennemsnittet baseret på de resterende felter, der gør eksisterer.Men her er, hvad der sker, når ingen af felterne findes:
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 er
null
for alle dokumenter.Som vi så tidligere, resulterer et manglende felt i
null
ved brug af enkeltargumentsyntaksen .Eksempel:
db.pets.aggregate( [ { $group: { _id: "$type", avg: { $avg: "$oops!" } } } ] )
Resultat:
{ "_id" :"Kænguru", "avg" :null }{ "_id" :"Kat", "avg" :null }{ "_id" :"Hund", "avg" :null }Tilgængelige stadier
$avg
er tilgængelig i følgende trin:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
trin, der inkluderer en$expr
udtryk