MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $stdDevPop

В MongoDB, $stdDevPop операторът на тръбопровода за агрегиране изчислява стандартното отклонение на популацията на своите входни стойности.

Входните стойности могат да бъдат от група документи (т.е. документи, които са групирани по един и същ ключ) или могат да бъдат множество полета в рамките на един документ.

Синтаксис

$stdDevPop операторът поддържа два синтаксиса.

Синтаксис 1:

{ $stdDevPop: <expression> } 

Синтаксис 2:

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

Първият синтаксис приема един аргумент, а вторият синтаксис приема множество аргументи.

Когато се използва в $group етап, можете да използвате само първия синтаксис. В този случай $stdDevPop връща стандартното отклонение на популацията на посочения израз за група документи, които споделят една и съща група по ключ.

Примери за синтаксис 1 (единичен аргумент)

Ето няколко примера, които използват синтаксис 1.

Групирани документи

Този пример използва $stdDevPop във връзка с $group за да върнете стандартното отклонение в група документи, които са групирани по ключ.

Да предположим, че имаме колекция, наречена stonks със следните документи:

{ "_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", " цена" :138 }{ "_id" :13, "тикер" :"jnj", "цена" :141 }{ "_id" :14, "тикер" :"jnj", "цена" :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 }

Можем да групираме тези документи по техния ticker поле и след това използвайте $stdDevPop за да върне стандартното отклонение на популацията на price поле за всяка група:

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

Резултат:

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

Можем да видим, че gme има много по-високо стандартно отклонение от jnj .

Масиви

Този пример се прилага $stdDevPop към един документ, който съдържа поле с масив от стойности.

Тази опция е налична само при използване на синтаксис на единичен аргумент. Масивите се игнорират, когато се използва синтаксисът с няколко аргумента (повече за това по-долу).

Да предположим, че имаме колекция, наречена players със следните документи:

{ "_id" :1, "player" :"Homer", "резултати" :[ 1, 7, 2, 3, 8, 7, 1 ] }{ "_id" :2, "player" :" Мардж", "резултати" :[ 0, 1, 8, 17, 18, 8 ] }{ "_id" :3, "играч" :"Барт", "резултати" :[ 15, 11, 8, 0, 1 , 3 ] }{ "_id" :4, "player" :"Brian", "cores" :[ 7 ] }{ "_id" :5, "player" :"Farnsworth", "cores" :[ ] }{ "_id" :6, "player" :"Meg", "резултати" :null }

Можем да приложим $stdDevPop към scores поле във всеки документ:

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

Резултат:

{ "_id" :1, "standardDeviation" :2.849991049037143 }{ "_id" :2, "standardDeviation" :6.968181653455625 }{ "_id" :3, "standardDeviation" :3, "standardDeviation" 6 :83 "id" 5 :8 5 "1" :8 7 ". standardDeviation" :0 }{ "_id" :5, "standardDeviation" :null }{ "_id" :6, "standardDeviation" :null }

В този случай първите три документа върнаха стандартното отклонение за различните числа, които бяха в съответните им масиви.

Документ 4 даде стандартно отклонение от 0 . Това е така, защото предоставихме само едно число в масива.

Документ 5 върна null защото предоставихме празен масив.

Документ 6 върна null защото предоставихме null като аргумент.

Пример за синтаксис 2 (множество аргументи)

Вторият синтаксис включва предоставяне на $stdDevPop с повече от един аргумент. $stdDevPop след това изчислява стандартното отклонение въз основа на всички предоставени аргументи.

Да предположим, че имаме колекция, наречена data със следните документи:

{ "_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" :"Хей" } 

Можем да използваме $stdDevPop за да върне стандартното отклонение на популацията на a , b , c и d полета на всеки документ:

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

Резултат:

{ "_id" :1, "резултат" :1.118033988749895 }{ "_id" :2, "резултат" :0.816496580927726 }{ "_id" :3, "резултат" :0.81649 }
 Документ 1 връща стандартното отклонение въз основа на входните стойности на 1 , 2 , 3 и 4 .

Последните два документа обаче върнаха само стандартното отклонение за входните стойности на 1 , 2 и 3 . $stdDevPop операторът игнорира техния d полета.

Защо е това?

Начинът, по който работи е, че $stdDevPop игнорира нечислови стойности. Така че в този случай той игнорира "Hey" в документ 3 и изчислява стандартното отклонение на популацията от останалите (числови) полета.

Що се отнася до документ 2, неговият d полето съдържа масив. Както споменахме, $stdDevPop операторът игнорира масиви, когато използва синтаксис с няколко аргумента. По-точно, той третира масивите като нечислови стойности, когато се използва в този контекст. И както споменахме, $stdDevPop игнорира нечислови стойности.

Ако всички стойности не са числови, тогава $stdDevPop връща null .

Липсващи полета

Когато използвате синтаксиса с множество аргументи, $stdDevPop игнорира всички липсващи полета. Тоест, ако предоставите поле, което не съществува, то го игнорира. Ако нито едно от полетата не съществува, то връща null .

Пример:

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

Резултат:

{ "_id" :1, "резултат" :1.118033988749895 }{ "_id" :2, "резултат" :0.816496580927726 }{ "_id" :3, "резултат" :0.81649 }
 В този случай предоставих допълнително поле ($e ), който не съществува в документа. $stdDevPop изчисли стандартното отклонение въз основа на останалите полета, които правят съществуват.

Но ето какво се случва, когато няма от полетата съществуват:

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

Резултат:

{ "_id" :1, "резултат" :null }{ "_id" :2, "резултат" :нулев }{ "_id" :3, "резултат" :нулев }

Резултатът е null за всички документи.

Когато се използва синтаксисът с един аргумент, липсващо поле води до null .

Пример:

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

Резултат:

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

Налични етапи

$stdDevPop е наличен в следните етапи:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match етап, който включва $expr израз

Изчислете примерното стандартно отклонение

Вижте MongoDB $stdDevSamp ако трябва да вземете мострата стандартно отклонение, за разлика от популацията стандартно отклонение. Този оператор е полезен, ако вашите стойности обхващат извадка от съвкупност от данни, от които да обобщите популацията.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Създаване на многополеви индекси в Mongoose / MongoDB

  2. Не може да се създаде/отваря файл за заключване:/data/mongod.lock errno:13 Отказано разрешение

  3. Как да се присъедините към две допълнителни колекции с условия

  4. Mongodb :$in оператор срещу много единични заявки

  5. Как да влезете в производството с MongoDB - Топ десет съвета