sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $avg Aggregation Pipeline Operator

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 til scores 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 leveret null 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 af a , b , c og d 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 og 4 .

De næste to dokumenter returnerede dog kun gennemsnittet af inputværdierne for 1 , 2 og 3 . $avg operatør ignorerede deres d 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 returnerer null . 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 det null .

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

  1. Hvordan beskytter man adgangskodefeltet i Mongoose/MongoDB, så det ikke vender tilbage i en forespørgsel, når jeg udfylder samlinger?

  2. MongoDB C#:ID-serialisering bedste mønster

  3. Redis:Amazon EC2 vs Elasticache

  4. Mongoose Schema er ikke blevet registreret for model