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

MongoDB $stdDevPop

I MongoDB er $stdDevPop aggregeringspipeline-operatør beregner populationens standardafvigelse for dens inputværdier.

Indtastningsværdierne kan være fra en gruppe dokumenter (dvs. dokumenter, der er grupperet efter samme nøgle), eller de kan være flere felter i et enkelt dokument.

Syntaks

$stdDevPop operatoren understøtter to syntakser.

Syntaks 1:

{ $stdDevPop: <expression> } 

Syntaks 2:

{ $stdDevPop: [ <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 $stdDevPop returnerer populationens standardafvigelse for det angivne udtryk for en gruppe 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 $stdDevPop i forbindelse med $group for at returnere standardafvigelsen på tværs af en gruppe dokumenter, der er grupperet efter nøgle.

Antag, at vi har en samling kaldet stonks med følgende dokumenter:

{ "_id" :1, "ticker" :"gme", "price" :10 }{ "_id" :2, "ticker" :"gme", "price" :40 }{ "_id" :3, "ticker" :"gme", "price" :90 }{ "_id" :4, "ticker" :"gme", "price" :180 }{ "_id" :5, "ticker" :"gme ", "price" :290 }{ "_id" :6, "ticker" :"gme", "price" :390 }{ "_id" :7, "ticker" :"gme", "price" :190 } { "_id" :8, "ticker" :"gme", "price" :90 }{ "_id" :9, "ticker" :"gme", "price" :10 }{ "_id" :10, " ticker" :"jnj", "price" :131 }{ "_id" :11, "ticker" :"jnj", "price" :133 }{ "_id" :12, "ticker" :"jnj", " price" :138 }{ "_id" :13, "ticker" :"jnj", "price" :141 }{ "_id" :14, "ticker" :"jnj", "price" :145 }{ "_id" " :15, "ticker" :"jnj", "price" :150 }{ "_id" :16, "ticker" :"jnj", "price" :154 }{ "_id" :17, "ticker" :"jnj", "price" :156 }{ "_id" :18, "ticker" :"jnj", "price" :160 }

Vi kan gruppere disse dokumenter efter deres ticker felt, og brug derefter $stdDevPop for at returnere populationens standardafvigelse for price felt for hver gruppe:

db.stonks.aggregate(
   [
     {
       $group:
          {
            _id: "$ticker",
            standardDeviation: { $stdDevPop: "$price" }
          }
     }
   ]
) 

Resultat:

{ "_id" :"gme", "standardDeviation" :123.7380746218039 }{ "_id" :"jnj", "standardDeviation" :9.752492558885207 }

Vi kan se den gme har en meget højere standardafvigelse end jnj .

Arrays

Dette eksempel gælder $stdDevPop 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 }

Vi kan anvende $stdDevPop til scores felt i hvert dokument:

db.players.aggregate(
   [
     {
       $project:
          {
            standardDeviation: { $stdDevPop: "$scores" }
          }
     }
   ]
) 

Resultat:

{ "_id" :1, "standardafvigelse" :2.849991049037143 }{ "_id" :2, "standardafvigelse" :6.968181653455625 }{ "_id" :3, "standardafvigelse" 5, 73. 5, 73 :8 :8 :8, 6, 13 standardDeviation" :0 }{ "_id" :5, "standardDeviation" :null }{ "_id" :6, "standardDeviation" :null }

I dette tilfælde returnerede de første tre dokumenter standardafvigelsen for de forskellige tal, der var i deres respektive arrays.

Dokument 4 resulterede i en standardafvigelse på 0 . Dette skyldes, at vi kun har angivet ét nummer i arrayet.

Dokument 5 returnerede null fordi vi leverede et tomt array.

Dokument 6 returnerede null fordi vi har leveret null som argumentet.

Eksempel på syntaks 2 (flere argumenter)

Den anden syntaks involverer at give $stdDevPop med mere end ét argument. $stdDevPop beregner derefter standardafvigelsen 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" } 

Vi kan bruge $stdDevPop for at returnere populationens standardafvigelse for a , b , c og d felter i hvert dokument:

db.data.aggregate(
   [
     {
       $project:
          {
            result: { $stdDevPop: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
) 

Resultat:

{ "_id" :1, "result" :1.118033988749895 }{ "_id" :2, "result" :0.816496580927726 }{ "_id" :3, "result" :0,5816497} 

Dokument 1 returnerer standardafvigelsen baseret på dets inputværdier 1 , 2 , 3 og 4 .

De sidste to dokumenter returnerede dog kun standardafvigelsen for inputværdier på 1 , 2 og 3 . $stdDevPop operatør ignorerede deres d felter.

Hvorfor er dette?

Måden det fungerer på er at $stdDevPop ignorerer ikke-numeriske værdier. Så i dette tilfælde ignorerede den "Hey" i dokument 3 og beregnede populationens standardafvigelse fra de resterende (numeriske) felter.

Hvad angår dokument 2, er dets d felt indeholder en matrix. Som nævnt er $stdDevPop 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 som nævnt, $stdDevPop ignorerer ikke-numeriske værdier.

Hvis alle værdier er ikke-numeriske, så $stdDevPop returnerer null .

Manglende felter

Når du bruger multi-argument-syntaksen, $stdDevPop 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:
          {
            result: { $stdDevPop: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
) 

Resultat:

{ "_id" :1, "result" :1.118033988749895 }{ "_id" :2, "result" :0.816496580927726 }{ "_id" :3, "result" :0,5816497} 

I dette tilfælde har jeg angivet et ekstra felt ($e ), der ikke findes i dokumentet. $stdDevPop beregnet standardafvigelsen 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: { $stdDevPop: [ "$x", "$y", "$z" ] }
          }
     }
   ]
) 

Resultat:

{ "_id" :1, "result" :null }{ "_id" :2, "result" :null }{ "_id" :3, "result" :null }

Resultatet er null for alle dokumenter.

Når du bruger enkelt-argument-syntaksen, resulterer et manglende felt i null .

Eksempel:

db.stonks.aggregate(
   [
     {
       $group:
          {
            _id: "$ticker",
            standardDeviation: { $stdDevPop: "$oops!" }
          }
     }
   ]
) 

Resultat:

{ "_id" :"gme", "standardDeviation" :null }{ "_id" :"jnj", "standardDeviation" :null }

Tilgængelige stadier

$stdDevPop er tilgængelig i følgende trin:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match trin, der inkluderer en $expr udtryk

Beregn prøvens standardafvigelse

Se MongoDB $stdDevSamp hvis du har brug for at få eksemplet standardafvigelse i modsætning til befolkningen standardafvigelse. Denne operator er nyttig, hvis dine værdier omfatter en stikprøve af en population af data, hvorfra der kan generaliseres om populationen.


  1. MongoDB Whitespace-tegn

  2. MongoDB .NET genererer ikke _id ved upsert

  3. Hvordan gemmer jeg en fil i MongoDB?

  4. FEJL:Kan ikke skrive pid-fil til /var/run/mongodb/mongod.pid:Ingen sådan fil eller mappe inf fedora 20