MongoDB聚合运算符:$stdDevPop
文章目录
$stdDevPop
聚合运算符用来计算输入值的总体标准差。如果确认数据代表了整个数据集,且不希望对更大的群体进行归纳,可以使用
$stdDevPop
来计算总体标准差。如果数据仅代表了总体的一部分样本,但又想把结论推广到整个数据集,则应该使用
$stdDevSamp
。
$stdDevPop
可以应用于下面的阶段:
$addFields
,从MongoDB3.4开始支持$group
$match
阶段的$expr
表达式$project
$replaceRoot
,从MongoDB 3.4开始支持$replaceWith
,从MongoDB 4.2开始支持$set
,从MongoDB 4.2开始支持$setWindowFields
,从MongoDB 5.0开始支持
语法
当用于$bucket
、$bucketAuto
、$group
和$setWindowFields
阶段时的语法为:
{
$stdDevPop: <expression> }
当用于其它阶段时,$stdDevPop
的语法有两种形式:
-
操作数为一个表达式:
{ $stdDevPop: <expression> }
-
操作数为一个表达式列表:
{ $stdDevPop: [ <expression1>, <expression2> ... ] }
<expression>
为可解析为数组的表达式。
参数可以是任何能够解析为数组的表达式。
使用
非数值类型的值
$stdDevPop
忽略所有非数值的值,如果所有的操作数都是非数值的值,$stdDevPop
返回null。
单个值
如果样本只有一个数值类型的值,$stdDevPop
返回0。
数组操作数
在$group
和$setWindowFields
阶段,如果表达式解析为数组,$stdDevPop
会将操作数视为非数字值,对计算没有影响。
针对其它阶段:
- 当使用单个表达式作为操作数时,如果表达式解析为数组,
$stdDevPop
会遍历数组元素,并对数字元素进行操作返回单个值。 - 当使用表达式列表作为操作数,如果表达式解析为数组,
$stdDevPop
不会遍历该数组,而是将数组视为非数字值。
窗口值
对于$setWindowFields
阶段窗口的值:
- 忽略窗口中的非数值、空值和缺失字段。
- 如果窗口为空,则返回 null。
- 如果窗口中包含 NaN 值,则返回空值。
- 如果窗口包含 Infinity 值,则返回空值。
- 如果前面几点都不适用,则返回一个 double 值。
举例
应用于$group
阶段
使用下面的脚本创建users
集合:
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 },
{