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

MongoDB $stdDevSamp

I MongoDB er $stdDevSamp aggregeringspipeline-operatør beregner prøvestandardafvigelsen for inputværdierne.

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

$stdDevSamp ligner $stdDevPop . Forskellen er, at $stdDevSamp beregner prøven standardafvigelse, hvorimod $stdDevPop beregner befolkningen standardafvigelse.

Brug derfor $stdDevSamp hvis dine værdier omfatter en stikprøve af en population af data, hvorfra man kan generalisere om populationen. Hvis værdierne repræsenterer hele populationen af ​​data, eller du ikke ønsker at generalisere om en større population, skal du bruge $stdDevPop i stedet.

Syntaks

$stdDevSamp operatoren understøtter to syntakser.

Syntaks 1:

{ $stdDevSamp: <expression> } 

Syntaks 2:

{ $stdDevSamp: [ <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 $stdDevSamp returnerer prøvestandardafvigelsen 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 $stdDevSamp i forbindelse med $group for at returnere prøvestandardafvigelsen 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 $stdDevSamp for at returnere prøvestandardafvigelsen for price felt for hver gruppe:

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

Resultat:

{ "_id" :"gme", "result" :131.24404748406687 }{ "_id" :"jnj", "result" :10.344080432788612 }

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

Arrays

Dette eksempel gælder $stdDevSamp 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 $stdDevSamp til scores felt i hvert dokument:

db.players.aggregate(
   [
     {
       $project:
          {
            result: { $stdDevSamp: "$scores" }
          }
     }
   ]
) 

Resultat:

{ "_id" :1, "result" :3.0783421635988546 }{ "_id" :2, "result" :7.633260552782583 }{ "_id" :3, "result" :8.5818}{7.5827 result" :null }{ "_id" :5, "result" :null }{ "_id" :6, "result" :null }

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

Dokument 4 resulterede i en standardafvigelse på null . Dette skyldes, at vi kun har angivet ét nummer i arrayet. Hvis vi havde brugt $stdDevPop , ville dette have returneret 0 .

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 $stdDevSamp med mere end ét argument. $stdDevSamp 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 $stdDevSamp for at returnere prøvestandardafvigelsen for a , b , c og d felter i hvert dokument:

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

Resultat:

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

Det første dokuments resultat er baseret på inputværdierne for 1 , 2 , 3 og 4 .

De sidste to dokumenter resulterede dog kun i 1 , 2 og 3 bliver vurderet. $stdDevSamp operatør ignorerede deres d felter.

$stdDevSamp ignorerer ikke-numeriske værdier. Så i dette tilfælde ignorerede den "Hey" i dokument 3 og beregnede prøvens standardafvigelse fra de resterende (numeriske) felter.

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

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

Manglende felter

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

Resultat:

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

I dette tilfælde har jeg angivet et ekstra felt ($e ), der ikke findes i dokumentet. $stdDevSamp beregnede prøvens standardafvigelse 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: { $stdDevSamp: [ "$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",
            result: { $stdDevSamp: "$oops!" }
          }
     }
   ]
) 

Resultat:

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

Tilgængelige stadier

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

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

  1. Hvordan opretter man en lokal Windows-baseret servicebus uden for Azure, der ligner Redis med automatisk fail-over?

  2. Opdatering af et indlejret array med MongoDB

  3. Hvad er forskellen mellem metoden insert(), insertOne() og insertMany()?

  4. jackson deserialiser objekt med liste over forårets grænseflade