sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $stdDevPop

I MongoDB, $stdDevPop aggregeringspipeline-operatören beräknar populationens standardavvikelse för dess ingångsvärden.

Inmatningsvärdena kan komma från en grupp av dokument (dvs. dokument som är grupperade efter samma nyckel), eller så kan de vara flera fält inom ett enda dokument.

Syntax

$stdDevPop operatorn stöder två syntaxer.

Syntax 1:

{ $stdDevPop: <expression> } 

Syntax 2:

{ $stdDevPop: [ <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, $stdDevPop returnerar populationens standardavvikelse för det angivna uttrycket för en grupp dokument som delar samma grupp med 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 $stdDevPop i samband med $group för att returnera standardavvikelsen över en grupp av dokument som är grupperade efter nyckel.

Anta att vi har en samling som heter stonks med följande dokument:

{ "_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 gruppera dessa dokument efter deras ticker och använd sedan $stdDevPop för att returnera populationens standardavvikelse för price fält för varje grupp:

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 mycket högre standardavvikelse än jnj .

Arrayer

Det här exemplet gäller $stdDevPop 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 }

Vi kan använda $stdDevPop till scores fält i varje dokument:

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

Resultat:

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

I det här fallet returnerade de tre första dokumenten standardavvikelsen för de olika siffrorna som fanns i deras respektive matriser.

Dokument 4 resulterade i en standardavvikelse på 0 . Detta beror på att vi bara angav 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.

Exempel på syntax 2 (flera argument)

Den andra syntaxen innebär att tillhandahålla $stdDevPop med mer än ett argument. $stdDevPop beräknar sedan standardavvikelsen 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" } 

Vi kan använda $stdDevPop för att returnera populationens standardavvikelse för a , b , c och d fält för varje 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,5816949 

Dokument 1 returnerar standardavvikelsen baserat på dess ingångsvärden 1 , 2 , 3 och 4 .

De två sista dokumenten returnerade dock bara standardavvikelsen för indatavärden 1 , 2 och 3 . $stdDevPop operatören ignorerade deras d fält.

Varför är detta?

Så det fungerar är att $stdDevPop ignorerar icke-numeriska värden. Så i det här fallet ignorerade den "Hey" i dokument 3 och beräknade populationens standardavvikelse 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, $stdDevPop 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 som nämnts, $stdDevPop ignorerar icke-numeriska värden.

Om alla värden är icke-numeriska, då $stdDevPop returnerar null .

Fält saknas

När du använder syntaxen för flera argument, $stdDevPop 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:
          {
            result: { $stdDevPop: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
) 

Resultat:

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

I det här fallet angav jag ett extra fält ($e ) som inte finns i dokumentet. $stdDevPop beräknade standardavvikelsen 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: { $stdDevPop: [ "$x", "$y", "$z" ] }
          }
     }
   ]
) 

Resultat:

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

Resultatet är null för alla dokument.

När du använder syntaxen med ett argument resulterar ett saknat fält i null .

Exempel:

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

Resultat:

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

Tillgängliga steg

$stdDevPop är tillgänglig i följande steg:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match steg som inkluderar en $expr uttryck

Beräkna provets standardavvikelse

Se MongoDB $stdDevSamp om du behöver få provet standardavvikelse, i motsats till populationen standardavvikelse. Den här operatorn är användbar om dina värden omfattar ett urval av en population av data för att generalisera om populationen.


  1. Redis listor

  2. Kör javascript-skript (.js-fil) i mongodb inklusive en annan fil inuti js

  3. Antalet utgående nycklar listade av infokommandot på redis-slaven överensstämmer inte med vad jag ser

  4. Mongoose indexering i produktionskod