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

MongoDB $stdDevPop

W MongoDB $stdDevPop Operator potoku agregacji oblicza odchylenie standardowe populacji swoich 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.

Składnia

$stdDevPop operator obsługuje dwie składnie.

Składnia 1:

{ $stdDevPop: <expression> }

Składnia 2:

{ $stdDevPop: [ <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 $stdDevPop zwraca odchylenie standardowe populacji 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 $stdDevPop w połączeniu z $group aby zwrócić odchylenie standardowe 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 $stdDevPop aby zwrócić odchylenie standardowe populacji price pole dla każdej grupy:

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

Wynik:

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

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

Tablice

Ten przykład dotyczy $stdDevPop 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ć $stdDevPop do scores pole w każdym dokumencie:

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

Wynik:

{ "_id" : 1, "standardDeviation" : 2.849991049037143 }
{ "_id" : 2, "standardDeviation" : 6.968181653455625 }
{ "_id" : 3, "standardDeviation" : 5.467073155618908 }
{ "_id" : 4, "standardDeviation" : 0 }
{ "_id" : 5, "standardDeviation" : null }
{ "_id" : 6, "standardDeviation" : null }

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

Dokument 4 dał odchylenie standardowe 0 . Dzieje się tak, ponieważ w tablicy podaliśmy tylko jedną liczbę.

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 $stdDevPop z więcej niż jednym argumentem. $stdDevPop 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ć $stdDevPop aby zwrócić odchylenie standardowe populacji a , b , c i d pola każdego dokumentu:

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

Wynik:

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

Dokument 1 zwraca odchylenie standardowe na podstawie wartości wejściowych 1 , 2 , 3 i 4 .

Jednak ostatnie dwa dokumenty zwróciły tylko odchylenie standardowe dla wartości wejściowych 1 , 2 i 3 . $stdDevPop operator zignorował ich d pola.

Dlaczego tak jest?

Działa to tak, że $stdDevPop ignoruje wartości nieliczbowe. Więc w tym przypadku zignorował "Hey" w dokumencie 3 i obliczył odchylenie standardowe populacji od pozostałych (liczbowych) pól.

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

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

Brakujące pola

Używając składni wieloargumentowej, $stdDevPop 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: { $stdDevPop: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
)

Wynik:

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

W tym przypadku dodałem dodatkowe pole ($e ), który nie istnieje w dokumencie. $stdDevPop obliczył odchylenie standardowe 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: { $stdDevPop: [ "$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",
            standardDeviation: { $stdDevPop: "$oops!" }
          }
     }
   ]
)

Wynik:

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

Dostępne etapy

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

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

Oblicz przykładowe odchylenie standardowe

Zobacz MongoDB $stdDevSamp jeśli potrzebujesz próbki odchylenie standardowe, w przeciwieństwie do populacji odchylenie standardowe. Ten operator jest przydatny, jeśli Twoje wartości obejmują próbkę populacji danych, z której można uogólnić populację.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Co to jest TransientTransactionError w Mongoose (lub MongoDB)?

  2. Konwertuj datę z milisekund na obiekt ISODate

  3. MongoDB :znajdź wartość w tablicy z wieloma kryteriami

  4. Utrzymywanie otwartego połączenia z bazą danych MongoDB

  5. Nie można połączyć się z bazą danych Mongo Cloud mongodb w Golang na Ubuntu