$stdDevPop (aggregation)
定义
5.0 版本中的更改。
Calculates the population standard deviation of the input values.
Use if the values encompass the entire population of data you want
to represent and do not wish to generalize about a larger
population. $stdDevPop
ignores non-numeric values.
If the values represent only a sample of a population of data from
which to generalize about the population, use $stdDevSamp
instead.
$stdDevPop
可在以下阶段使用:
$setWindowFields
(从 MongoDB 5.0 开始可用)
语法
当在 $bucket
、$bucketAuto
、$group
和 $setWindowFields
阶段使用时,$stdDevPop
具有以下语法:
{ $stdDevPop: <expression> }
When used in other supported stages, $stdDevPop
has one of
two syntaxes:
$stdDevPop
将一个指定表达式作为其操作数:{ $stdDevPop: <expression> } $stdDevPop
将指定表达式的列表作为其操作数:{ $stdDevPop: [ <expression1>, <expression2> ... ] }
The argument for $stdDevPop
can be any 表达式(expression) as long as it resolves to an array.
有关表达式的更多信息,请参阅表达式运算符。
行为
Non-numeric Values
$stdDevPop
ignores non-numeric values. If all operands for a
$stdDevPop
are non-numeric, $stdDevPop
returns
null
.
Single Value
If the sample consists of a single numeric value, $stdDevPop
returns 0
.
数组操作数
In the $group
and $setWindowFields
stages,
if the expression resolves to an array, $stdDevPop
treats the
operand as a non-numerical value and has no effect on the calculation.
在其他支持的阶段:
使用单个表达式作为其操作数,如果表达式解析为大量,则
$stdDevPop
会遍历该大量,对大量的数字元素进行操作以返回单个值。将表达式列表作为其操作数,如果任何表达式解析为大量,
$stdDevPop
不会遍历该大量,而是将该大量视为非数字值。
Window Values
Behavior with values in a $setWindowFields
stage
窗口:
忽略窗口中的非数字值、
null
值和缺失字段。如果窗口为空,则返回
null
。如果窗口包含
NaN
值,则返回null
。If the window contains
Infinity
values, returnsnull
.如果前面的点都不适用,则返回
double
值。
示例
在 $group
阶段中使用
Create a collection called users
with the following documents:
db.users.insertMany( [ { _id : 1, name : "dave123", quiz : 1, score : 85 }, { _id : 2, name : "dave2", quiz : 1, score : 90 }, { _id : 3, name : "ahn", quiz : 1, score : 71 }, { _id : 4, name : "li", quiz : 2, score : 96 }, { _id : 5, name : "annT", quiz : 2, score : 77 }, { _id : 6, name : "ty", quiz : 2, score : 82 } ] )
The following example calculates the standard deviation of each quiz:
db.users.aggregate( [ { $group: { _id: "$quiz", stdDev: { $stdDevPop: "$score" } } } ] )
操作返回以下结果:
{ "_id" : 2, "stdDev" : 8.04155872120988 } { "_id" : 1, "stdDev" : 8.04155872120988 }
在 $project
阶段中使用
使用以下文档创建名为quizzes
的示例collection:
db.quizzes.insertMany( [ { _id : 1, scores : [ { name : "dave123", score : 85 }, { name : "dave2", score : 90 }, { name : "ahn", score : 71 } ] }, { _id : 2, scores : [ { name : "li", quiz : 2, score : 96 }, { name : "annT", score : 77 }, { name : "ty", score : 82 } ] } ] )
The following example calculates the standard deviation of each quiz:
db.quizzes.aggregate( [ { $project: { stdDev: { $stdDevPop: "$scores.score" } } } ] )
操作返回以下结果:
{ _id : 1, stdDev : 8.04155872120988 } { _id : 2, stdDev : 8.04155872120988 }
在 $setWindowFields
阶段中使用
版本 5.0 中的新增功能。
创建cakeSales
集合,其中包含加利福尼亚州 ( CA
) 和华盛顿州 ( WA
) 的蛋糕销售情况:
db.cakeSales.insertMany( [ { _id: 0, type: "chocolate", orderDate: new Date("2020-05-18T14:10:30Z"), state: "CA", price: 13, quantity: 120 }, { _id: 1, type: "chocolate", orderDate: new Date("2021-03-20T11:30:05Z"), state: "WA", price: 14, quantity: 140 }, { _id: 2, type: "vanilla", orderDate: new Date("2021-01-11T06:31:15Z"), state: "CA", price: 12, quantity: 145 }, { _id: 3, type: "vanilla", orderDate: new Date("2020-02-08T13:13:23Z"), state: "WA", price: 13, quantity: 104 }, { _id: 4, type: "strawberry", orderDate: new Date("2019-05-18T16:09:01Z"), state: "CA", price: 41, quantity: 162 }, { _id: 5, type: "strawberry", orderDate: new Date("2019-01-08T06:12:03Z"), state: "WA", price: 43, quantity: 134 } ] )
This example uses $stdDevPop
in the
$setWindowFields
stage to output the population standard
deviation of the cake sales quantity
for each state
:
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { stdDevPopQuantityForState: { $stdDevPop: "$quantity", window: { documents: [ "unbounded", "current" ] } } } } } ] )
在示例中:
partitionBy: "$state"
按state
对集合中的文档分区。
CA
和WA
都有分区。sortBy: { orderDate: 1 }
按orderDate
升序 (1
) 对每个分区中的文档进行排序,因此最早的
orderDate
位于最前面。
output
sets thestdDevPopQuantityForState
field to thequantity
population standard deviation value using$stdDevPop
that is run in a 文档 window.The 窗口 contains documents between an
unbounded
lower limit and thecurrent
document in the output. This means$stdDevPop
returns thequantity
population standard deviation value for the documents between the beginning of the partition and the current document.
In this example output, the quantity
population standard deviation
value for CA
and WA
is shown in the
stdDevPopQuantityForState
field:
{ _id : 4, type : "strawberry", orderDate : ISODate("2019-05-18T16:09:01Z"), state : "CA", price : 41, quantity : 162, stdDevPopQuantityForState : 0 } { _id : 0, type : "chocolate", orderDate : ISODate("2020-05-18T14:10:30Z"), state : "CA", price : 13, quantity : 120, stdDevPopQuantityForState : 21 } { _id : 2, type : "vanilla", orderDate : ISODate("2021-01-11T06:31:15Z"), state : "CA", price : 12, quantity : 145, stdDevPopQuantityForState : 17.249798710580816 } { _id : 5, type : "strawberry", orderDate : ISODate("2019-01-08T06:12:03Z"), state : "WA", price : 43, quantity : 134, stdDevPopQuantityForState : 0 } { _id : 3, type : "vanilla", orderDate : ISODate("2020-02-08T13:13:23Z"), state : "WA", price : 13, quantity : 104, stdDevPopQuantityForState : 15 } { _id : 1, type : "chocolate", orderDate : ISODate("2021-03-20T11:30:05Z"), state : "WA", price : 14, quantity : 140, stdDevPopQuantityForState : 15.748015748023622 }