sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $avg Aggregation Pipeline Operator

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 till scores 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ållit null 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 av a , b , c och d 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 och 4 .

De följande två dokumenten returnerade dock bara medelvärdet av ingångsvärdena för 1 , 2 och 3 . $avg operatören ignorerade deras d 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 returnerar null . 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 det null .

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

  1. Mongo C# JSON-läsaren förväntade sig ett värde men hittade 'replSetGetStatus'

  2. Hur visar jag base64-bilden i reager?

  3. Lägg till ledande nollor i SQL

  4. C#/.NET-klient för Redis