В 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 }7 81642Документ 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 }7 81642В този случай предоставих допълнително поле (
$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
ако трябва да вземете мострата стандартно отклонение, за разлика от популацията стандартно отклонение. Този оператор е полезен, ако вашите стойности обхващат извадка от съвкупност от данни, от които да обобщите популацията.