定义
在版本5.0中进行了更改。
计算输入值的示例标准偏差。如果这些值包含要概括总体数据的数据总体示例,则使用此值。$stdDevSamp 忽略非数字值。
如果这些值代表整个数据总体,或者您不希望对更大的数据总体进行概括,请改用$stdDevPop 。
$stdDevSamp 可在以下阶段使用:
$setWindowFields(从 MongoDB 5.0 开始提供)
语法
在$bucket 、$bucketAuto 、$group 和$setWindowFields 阶段使用时,$stdDevSamp 采用以下语法:
{ $stdDevSamp: <expression> }
用于其他受支持的阶段时,$stdDevSamp 采用以下两种语法之一:
$stdDevSamp有一个指定的表达式作为其操作数:{ $stdDevSamp: <expression> } $stdDevSamp有一个指定表达式组成的列表作为其操作数:{ $stdDevSamp: [ <expression1>, <expression2> ... ] }
$stdDevSamp的参数可以是任何表达式,只要它解析为大量即可。
有关表达式的更多信息,请参阅表达式。
行为
结果类型
$stdDevSamp 以double形式返回输入值的示例标准差。
非数值
$stdDevSamp忽略非数字值。如果求和的所有操作数都是非数字,则$stdDevSamp 返回null 。
单值
如果示例由单个数值组成,则$stdDevSamp 返回null 。
数组操作数
在$group 和$setWindowFields 阶段,如果表达式解析为大量,则$stdDevSamp 会将操作数视为非数字值。
在其他支持的阶段:
使用单个表达式作为其操作数,如果表达式解析为大量,则
$stdDevSamp会遍历该大量,对大量的数字元素进行操作以返回单个值。将表达式列表作为其操作数,如果任何表达式解析为大量,
$stdDevSamp不会遍历该大量,而是将该大量视为非数字值。
窗口值
忽略窗口中的非数字值、
null值和缺失字段。如果窗口为空,则返回
null。如果窗口包含
NaN值,则返回null。如果窗口包含
Infinity值,则返回null。如果前面的点都不适用,则返回
double值。
示例
在 $group 阶段中使用
collection users 包含具有以下字段的文档:
db.users.insertMany( [ { _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: { size: 100 } }, { $group: { _id: null, ageStdDev: { $stdDevSamp: "$age" } } } ] )
该操作返回如下结果:
{ _id: null, ageStdDev: 7.811258386185771 }
在 $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 } ] )
此示例在$stdDevSamp $setWindowFields阶段使用quantity 来输出每个 蛋糕销售的state 值的示例标准差:
db.cakeSales.aggregate( [ { $setWindowFields: { partitionBy: "$state", sortBy: { orderDate: 1 }, output: { stdDevSampQuantityForState: { $stdDevSamp: "$quantity", window: { documents: [ "unbounded", "current" ] } } } } } ] )
在示例中:
partitionBy: "$state"按state对集合中的文档分区。CA和WA都有分区。sortBy: { orderDate: 1 }按orderDate以升序 (1) 对每个分区中的文档进行排序,因此最早的orderDate位于最前面。
output使用在文档窗口中运行的$stdDevSampstdDevSampQuantityForState将quantity字段设置为 值的示例标准差。该窗口包含介于
unbounded下限和输出中current文档之间的文档。这意味着$stdDevSampquantity返回分区开头和当前文档之间文档的 值的示例差。
在此输出中, CA和WA的样本标准偏差quantity值显示在stdDevSampQuantityForState字段中:
{ _id: 4, type: "strawberry", orderDate: ISODate("2019-05-18T16:09:01Z"), state: "CA", price: 41, quantity: 162, stdDevSampQuantityForState: null } { _id: 0, type: "chocolate", orderDate: ISODate("2020-05-18T14:10:30Z"), state: "CA", price: 13, quantity: 120, stdDevSampQuantityForState: 29.698484809834994 } { _id: 2, type: "vanilla", orderDate: ISODate("2021-01-11T06:31:15Z"), state: "CA", price: 12, quantity: 145, stdDevSampQuantityForState: 21.1266025033211 } { _id: 5, type: "strawberry", orderDate: ISODate("2019-01-08T06:12:03Z"), state: "WA", price: 43, quantity: 134, stdDevSampQuantityForState: null } { _id: 3, type: "vanilla", orderDate: ISODate("2020-02-08T13:13:23Z"), state: "WA", price: 13, quantity: 104, stdDevSampQuantityForState: 21.213203435596427 } { _id: 1, type: "chocolate", orderDate: ISODate("2021-03-20T11:30:05Z"), state: "WA", price: 14, quantity: 140, stdDevSampQuantityForState: 19.28730152198591 }