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

MongoDB $stdDevSamp

V MongoDB, $stdDevSamp operátor agregačního potrubí vypočítá vzorovou směrodatnou odchylku 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.

$stdDevSamp je podobný $stdDevPop . Rozdíl je v tom, že $stdDevSamp vypočítá vzorek standardní odchylka, zatímco $stdDevPop vypočítá populaci standardní odchylka.

Proto použijte $stdDevSamp pokud vaše hodnoty zahrnují vzorek populace dat, ze kterých lze zobecnit populaci. Pokud hodnoty představují celou populaci dat nebo si nepřejete zobecňovat větší populaci, použijte $stdDevPop místo toho.

Syntaxe

$stdDevSamp operátor podporuje dvě syntaxe.

Syntaxe 1:

{ $stdDevSamp: <expression> }

Syntaxe 2:

{ $stdDevSamp: [ <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ě $stdDevSamp vrátí vzorovou směrodatnou odchylku 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á $stdDevSamp ve spojení s $group vrátit vzorovou 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", "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 }

Tyto dokumenty můžeme seskupit podle jejich ticker a poté použijte $stdDevSamp vrátíte vzorovou směrodatnou odchylku price pole pro každou skupinu:

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

Výsledek:

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

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

Pole

Tento příklad platí $stdDevSamp 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", "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 }

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

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

Výsledek:

"
{ "_id" : 1, "result" : 3.0783421635988546 }
{ "_id" : 2, "result" : 7.633260552782583 }
{ "_id" : 3, "result" : 5.988878581726855 }
{ "_id" : 4, "result" : null }
{ "_id" : 5, "result" : null }
{ "_id" : 6, "result" : null }

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

Výsledkem dokumentu 4 byla standardní odchylka null . Je to proto, že jsme zadali pouze jedno číslo v poli. Pokud bychom použili $stdDevPop , vrátilo by to 0 .

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í $stdDevSamp s více než jedním argumentem. $stdDevSamp 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" : "Hey" }

Můžeme použít $stdDevSamp vrátit vzorovou směrodatnou odchylku a , b , c a d pole každého dokumentu:

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

Výsledek:

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

Výsledek prvního dokumentu je založen na vstupních hodnotách 1 , 2 , 3 a 4 .

Poslední dva dokumenty však vedly pouze k 1 , 2 a 3 je hodnocen. $stdDevSamp operátor ignoroval jejich d pole.

$stdDevSamp ignoruje nečíselné hodnoty. Takže v tomto případě ignoroval "Hey" v dokumentu 3 a vypočítal vzorovou směrodatnou odchylku ze zbývajících (číselných) polí.

Pokud jde o dokument 2, jeho d pole obsahuje pole. Jak již bylo zmíněno, $stdDevSamp 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, $stdDevSamp ignoruje nečíselné hodnoty.

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

Chybějící pole

Při použití víceargumentové syntaxe $stdDevSamp 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: { $stdDevSamp: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
)

Výsledek:

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

V tomto případě jsem poskytl další pole ($e ), který v dokumentu neexistuje. $stdDevSamp vypočítal vzorovou 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: { $stdDevSamp: [ "$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",
            result: { $stdDevSamp: "$oops!" }
          }
     }
   ]
)

Výsledek:

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

Dostupné fáze

$stdDevSamp 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

  1. MongoDB C# Driver 2.0 - Aktualizace dokumentu

  2. Přesnost příkazu redis dbsize

  3. gke nemůže zakázat transparentní obrovské stránky... povolení odepřeno

  4. Převést datum z milisekund na objekt ISODate