MongoDB聚合运算符:$stdDevSamp
$stdDevSamp
聚合运算符用来计算输入值的样本标准差。如果数据样本是总体的一部分并可以概括整体,可以使用
$stdDevSamp
。如果样本值代表了数据的总体,或者不希望概括更大的总体,则应该使用
$stdDevPop
。
$stdDevSamp
可以应用于下面的阶段:
$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
阶段时的语法为:
{
$stdDevSamp: <expression> }
当用于其它阶段时,$stdDevSamp
的语法有两种形式:
-
操作数为一个表达式:
{ $stdDevSamp: <expression> }
-
操作数为一个表达式列表:
{ $stdDevSamp: [ <expression1>, <expression2> ... ] }
<expression>
为可解析为数组的表达式。
参数可以是任何能够解析为数组的表达式。
使用
非数值类型的值
$stdDevSamp
忽略所有非数值的值,如果所有的操作数都是非数值的值,$stdDevSamp
返回null。
单个值
如果样本只有一个数值类型的值,$stdDevSamp
返回0。
数组操作数
在$group
和$setWindowFields
阶段,如果表达式解析为数组,$stdDevSamp
会将操作数视为非数字值,对计算没有影响。
针对其它阶段:
- 当使用单个表达式作为操作数时,如果表达式解析为数组,
$stdDevSamp
会遍历数组元素,并对数字元素进行操作返回单个值。 - 当使用表达式列表作为操作数,如果表达式解析为数组,
$stdDevSamp
不会遍历该数组,而是将数组视为非数字值。
窗口值
对于$setWindowFields
阶段窗口的值:
- 忽略窗口中的非数值、空值和缺失字段。
- 如果窗口为空,则返回 null。
- 如果窗口中包含 NaN 值,则返回空值。
- 如果窗口包含 Infinity 值,则返回空值。
- 如果前面几点都不适用,则返回一个 double 值。
举例
应用于$group
阶段
users
集合有下面的字段:
{
_id: 0, username: "user0", age: 20}
{
_id: 1, username: "user1", age: 42}
{
_id: 2, username: "user2", age: 28}
...
下面的聚合计算用户样本的标准差,首先使用$sample
管道阶段对100
个用户进行采样,然后使用$stdDevSamp
计算用户的样本标准差:
db.users.aggregate(
[
{
$sample: {