MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $stdDevSamp

W MongoDB $stdDevSamp Operator potoku agregacji oblicza odchylenie standardowe próbki wartości wejściowych.

Wartości wejściowe mogą pochodzić z grupy dokumentów (tj. dokumentów pogrupowanych według tego samego klucza) lub mogą być wieloma polami w jednym dokumencie.

$stdDevSamp jest podobny do $stdDevPop . Różnica polega na tym, że $stdDevSamp oblicza próbkę odchylenie standardowe, natomiast $stdDevPop oblicza populację odchylenie standardowe.

Dlatego użyj $stdDevSamp jeśli twoje wartości obejmują próbkę populacji danych, z której można uogólniać na temat populacji. Jeśli wartości reprezentują całą populację danych lub nie chcesz uogólniać na temat większej populacji, użyj $stdDevPop zamiast tego.

Składnia

$stdDevSamp operator obsługuje dwie składnie.

Składnia 1:

{ $stdDevSamp: <expression> }

Składnia 2:

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

Pierwsza składnia akceptuje jeden argument, a druga – wiele argumentów.

W przypadku użycia w grupie $group etapie, możesz użyć tylko pierwszej składni. W tym przypadku $stdDevSamp zwraca przykładowe odchylenie standardowe określonego wyrażenia dla grupy dokumentów, które dzielą tę samą grupę według klucza.

Przykłady składni 1 (pojedynczy argument)

Oto kilka przykładów używających składni 1.

Dokumenty zgrupowane

W tym przykładzie użyto $stdDevSamp w połączeniu z $group aby zwrócić odchylenie standardowe próbki w grupie dokumentów pogrupowanych według klucza.

Załóżmy, że mamy kolekcję o nazwie stonks z następującymi dokumentami:

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

Możemy pogrupować te dokumenty według ich ticker pole, a następnie użyj $stdDevSamp aby zwrócić przykładowe odchylenie standardowe price pole dla każdej grupy:

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

Wynik:

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

Widzimy, że gme ma znacznie wyższe odchylenie standardowe próbki niż jnj .

Tablice

Ten przykład dotyczy $stdDevSamp do pojedynczego dokumentu, który zawiera pole z tablicą wartości.

Ta opcja jest dostępna tylko w przypadku używania składni jednoargumentowej. Tablice są ignorowane podczas używania składni wieloargumentowej (więcej na ten temat poniżej).

Załóżmy, że mamy kolekcję o nazwie players z następującymi dokumentami:

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

Możemy zastosować $stdDevSamp do scores pole w każdym dokumencie:

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

Wynik:

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

W tym przypadku pierwsze trzy dokumenty zwróciły odchylenie standardowe próbki dla różnych liczb, które znajdowały się w ich odpowiednich tablicach.

Dokument 4 spowodował odchylenie standardowe null . Dzieje się tak, ponieważ w tablicy podaliśmy tylko jedną liczbę. Gdybyśmy użyli $stdDevPop , zwróciłoby to 0 .

Dokument 5 zwrócił null ponieważ dostarczyliśmy pustą tablicę.

Dokument 6 zwrócił null ponieważ podaliśmy null jako argument.

Przykład składni 2 (wiele argumentów)

Druga składnia obejmuje dostarczenie $stdDevSamp z więcej niż jednym argumentem. $stdDevSamp następnie oblicza odchylenie standardowe na podstawie wszystkich dostarczonych argumentów.

Załóżmy, że mamy kolekcję o nazwie data z następującymi dokumentami:

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

Możemy użyć $stdDevSamp aby zwrócić przykładowe odchylenie standardowe a , b , c i d pola każdego dokumentu:

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

Wynik:

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

Wynik pierwszego dokumentu jest oparty na wartościach wejściowych 1 , 2 , 3 i 4 .

Jednak ostatnie dwa dokumenty dały tylko 1 , 2 i 3 oceniane. $stdDevSamp operator zignorował ich d pola.

$stdDevSamp ignoruje wartości nieliczbowe. Więc w tym przypadku zignorował "Hey" w dokumencie 3 i obliczył odchylenie standardowe próbki z pozostałych (liczbowych) pól.

Jeśli chodzi o dokument 2, jego d pole zawiera tablicę. Jak wspomniano, $stdDevSamp operator ignoruje tablice podczas używania składni wieloargumentowej. Dokładniej, w tym kontekście traktuje tablice jako wartości nieliczbowe. I jak wspomniano, $stdDevSamp ignoruje wartości nieliczbowe.

Jeśli wszystkie wartości nie są liczbowe, to $stdDevSamp zwraca null .

Brakujące pola

Używając składni wieloargumentowej, $stdDevSamp ignoruje brakujące pola. Oznacza to, że jeśli podasz pole, które nie istnieje, ignoruje je. Jeśli żadne z pól nie istnieje, zwraca null .

Przykład:

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

Wynik:

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

W tym przypadku dodałem dodatkowe pole ($e ), który nie istnieje w dokumencie. $stdDevSamp obliczył odchylenie standardowe próbki na podstawie pozostałych pól, które wykonaj istnieje.

Oto jednak, co się dzieje, gdy brak z pól istnieje:

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

Wynik:

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

Wynik to null dla wszystkich dokumentów.

Gdy używasz składni jednoargumentowej, brakujące pole daje wynik null .

Przykład:

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

Wynik:

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

Dostępne etapy

$stdDevSamp jest dostępny w następujących etapach:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match etap zawierający $expr wyrażenie

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak programowo wstępnie podzielić klucz fragmentu oparty na GUID za pomocą MongoDB?

  2. Ograniczasz wyniki w MongoDB, ale nadal otrzymujesz pełną liczbę?

  3. Ustawianie czasu wygaśnięcia kolekcji w mongodb przy użyciu mongoose

  4. MongoDB Stowarzyszenie Wiele-do-Wiele

  5. Połącz ciąg i liczbę w SQL