sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $stdDevPop

V MongoDB, $stdDevPop operátor agregačního potrubí vypočítá směrodatnou odchylku základního souboru svých vstupních hodnot.

Vstupní hodnoty mohou být ze skupiny dokumentů (tj. dokumentů, které jsou seskupeny podle stejného klíče), nebo to může být více polí v rámci jednoho dokumentu.

Syntaxe

$stdDevPop operátor podporuje dvě syntaxe.

Syntaxe 1:

{ $stdDevPop: <expression> } 

Syntaxe 2:

{ $stdDevPop: [ <expression1>, <expression2> ... ]  } 

První syntaxe přijímá jeden argument a druhá syntaxe přijímá více argumentů.

Při použití ve $group fázi, můžete použít pouze první syntaxi. V tomto případě $stdDevPop vrátí směrodatnou odchylku populace zadaného výrazu pro skupinu dokumentů, které sdílejí stejnou skupinu podle klíče.

Příklady syntaxe 1 (jediný argument)

Zde je několik příkladů, které používají syntaxi 1.

Skupinové dokumenty

Tento příklad používá $stdDevPop ve spojení s $group vrátit směrodatnou odchylku ve skupině dokumentů, které jsou seskupeny podle klíče.

Předpokládejme, že máme sbírku nazvanou stonks s následujícími dokumenty:

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

Tyto dokumenty můžeme seskupit podle jejich ticker a poté použijte $stdDevPop vrátit standardní odchylku populace price pole pro každou skupinu:

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

Výsledek:

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

Můžeme vidět, že gme má mnohem vyšší směrodatnou odchylku než jnj .

Pole

Tento příklad platí $stdDevPop do jednoho dokumentu, který obsahuje pole s polem hodnot.

Tato možnost je dostupná pouze při použití syntaxe jednoho argumentu. Při použití víceargumentové syntaxe jsou pole ignorována (více o tom níže).

Předpokládejme, že máme kolekci nazvanou players s následujícími dokumenty:

{ "_id" :1, "player" :"Homer", "skóre" :[ 1, 7, 2, 3, 8, 7, 1 ] }{ "_id" :2, "player" :" Marge", "skóre" :[ 0, 1, 8, 17, 18, 8 ] }{ "_id" :3, "hráč" :"Bart", "skóre" :[ 15, 11, 8, 0, 1 , 3 ] }{ "_id" :4, "hráč" :"Brian", "skóre" :[ 7 ] }{ "_id" :5, "hráč" :"Farnsworth", "skóre" :[ ] }{ "_id" :6, "player" :"Meg", "scores" :null }

Můžeme použít $stdDevPop do scores pole v každém dokumentu:

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

Výsledek:

{ "_id" :1, "standardDeviation" :2,849991049037143 }{ "_id" :2, "standardDeviation" :6,968181653455625 }{ "_id" :3, "standardní odchylka" :4908 :45 standardDeviation" :0 }{ "_id" :5, "standardDeviation" :null }{ "_id" :6, "standardDeviation" :null }

V tomto případě první tři dokumenty vrátily standardní odchylku pro různá čísla, která byla v příslušných polích.

Výsledkem dokumentu 4 byla standardní odchylka 0 . Je to proto, že jsme v poli poskytli pouze jedno číslo.

Dokument 5 vrátil null protože jsme poskytli prázdné pole.

Dokument 6 vrátil null protože jsme poskytli null jako argument.

Příklad syntaxe 2 (více argumentů)

Druhá syntaxe zahrnuje poskytnutí $stdDevPop s více než jedním argumentem. $stdDevPop poté vypočítá směrodatnou odchylku na základě všech dodaných argumentů.

Předpokládejme, že máme kolekci nazvanou data s následujícími dokumenty:

{ "_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" :"Ahoj" } 

Můžeme použít $stdDevPop vrátit standardní odchylku populace pro a , b , c a d pole každého dokumentu:

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

Výsledek:

{ "_id" :1, "výsledek" :1,118033988749895 }{ "_id" :2, "výsledek" :0,816496580927726 }{ "_id" :3, "výsledek" :0,8709649 

Dokument 1 vrací směrodatnou odchylku na základě vstupních hodnot 1 , 2 , 3 a 4 .

Poslední dva dokumenty však vrátily pouze standardní odchylku pro vstupní hodnoty 1 , 2 a 3 . $stdDevPop operátor ignoroval jejich d pole.

Proč tomu tak je?

Funguje to tak, že $stdDevPop ignoruje nečíselné hodnoty. Takže v tomto případě ignoroval "Hey" v dokumentu 3 a vypočítal standardní odchylku populace ze zbývajících (číselných) polí.

Pokud jde o dokument 2, jeho d pole obsahuje pole. Jak již bylo zmíněno, $stdDevPop Při použití víceargumentové syntaxe operátor ignoruje pole. Přesněji řečeno, při použití v tomto kontextu považuje pole za nečíselné hodnoty. A jak bylo zmíněno, $stdDevPop ignoruje nečíselné hodnoty.

Pokud jsou všechny hodnoty nečíselné, pak $stdDevPop vrátí null .

Chybějící pole

Při použití víceargumentové syntaxe $stdDevPop ignoruje všechna chybějící pole. To znamená, že pokud zadáte pole, které neexistuje, bude je ignorovat. Pokud žádné z polí neexistuje, vrátí null .

Příklad:

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

Výsledek:

{ "_id" :1, "výsledek" :1,118033988749895 }{ "_id" :2, "výsledek" :0,816496580927726 }{ "_id" :3, "výsledek" :0,8709649 

V tomto případě jsem poskytl další pole ($e ), který v dokumentu neexistuje. $stdDevPop vypočítal směrodatnou odchylku na základě zbývajících polí, která dělají existovat.

Co se však stane, když žádné z polí existují:

db.data.aggregate(
   [
     {
       $project:
          {
            result: { $stdDevPop: [ "$x", "$y", "$z" ] }
          }
     }
   ]
) 

Výsledek:

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

Výsledek je null pro všechny dokumenty.

Při použití syntaxe s jedním argumentem má chybějící pole za následek null .

Příklad:

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

Výsledek:

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

Dostupné fáze

$stdDevPop je k dispozici v následujících fázích:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match fázi, která obsahuje $expr výraz

Vypočítejte vzorovou směrodatnou odchylku

Viz MongoDB $stdDevSamp pokud potřebujete získat vzorek standardní odchylka, na rozdíl od populace standardní odchylka. Tento operátor je užitečný, pokud vaše hodnoty zahrnují vzorek populace dat, ze kterých lze zobecnit populaci.


  1. Rychlý způsob, jak najít duplikáty v indexovaném sloupci v mongodb

  2. Jak zničit pracovní místa ve frontě resque pracovníky?

  3. Scrapy a procházení webu pomocí Scrapy a MongoDB

  4. MongoDB $ sqrt