Definition
$stdDevPop
Changed in version 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 is available in these stages:
$addFields$group$matchstage that includes an$exprexpression$project$replaceRoot$replaceWith$set$setWindowFields(Available starting in MongoDB 5.0)
Syntax
When used in the $bucket, $bucketAuto, $group, and $setWindowFields stages, $stdDevPop has this syntax:
{ $stdDevPop: <expression> }When used in other supported stages, $stdDevPop has one of two syntaxes:
$stdDevPophas one specified expression as its operand:{ $stdDevPop: <expression> }$stdDevPophas a list of specified expressions as its operand:{ $stdDevPop: [ <expression1>, <expression2> ... ] }The argument for
$stdDevPopcan be any expression as long as it resolves to an array.For more information on expressions, see Expressions.
Behavior
Result Type
$stdDevPopreturns the population standard deviation of the input values as adecimal.Non-numeric Values
$stdDevPopignores non-numeric values. If all operands for a$stdDevPopare non-numeric,$stdDevPopreturnsnull.Single Value
If the sample consists of a single numeric value,
$stdDevPopreturns0.Array Operand
In the
$groupand$setWindowFieldsstages, if the expression resolves to an array,$stdDevPoptreats the operand as a non-numerical value and has no effect on the calculation.In the other supported stages:
- With a single expression as its operand, if the expression resolves to an array,
$stdDevPoptraverses into the array to operate on the numeric elements of the array to return a single value. - With a list of expressions as its operand, if any of the expressions resolves to an array,
$stdDevPopdoes not traverse into the array but instead treats the array as a non-numeric value.
Window Values
Behavior with values in a
$setWindowFieldsstage window:- Ignores non-numeric values,
nullvalues, and missing fields in a window. - If the window is empty, returns
null. - If the window contains a
NaNvalue, returnsnull. - If the window contains
Infinityvalues, returnsnull. - If none of the previous points apply, returns a
doublevalue.
Examples
Use in
$groupStageCreate a collection called
userswith 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" } } }
] )The operation returns the following results:
{ "_id" : 2, "stdDev" : 8.04155872120988 }
{ "_id" : 1, "stdDev" : 8.04155872120988 }Use in
$projectStageCreate an example collection named
quizzeswith the following documents: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" } } }
] )The operation returns the following results:
{ _id : 1, stdDev : 8.04155872120988 }
{ _id : 2, stdDev : 8.04155872120988 }Use in
$setWindowFieldsStageNew in version 5.0.
Create a
cakeSalescollection that contains cake sales in the states of California (CA) and Washington (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
$stdDevPopin the$setWindowFieldsstage to output the population standard deviation of the cake salesquantityfor eachstate:db.cakeSales.aggregate( [
{
$setWindowFields: {
partitionBy: "$state",
sortBy: { orderDate: 1 },
output: {
stdDevPopQuantityForState: {
$stdDevPop: "$quantity",
window: {
documents: [ "unbounded", "current" ]
}
}
}
}
}
] )In the example:
partitionBy: "$state"partitions the documents in the collection bystate. There are partitions forCAandWA.sortBy: { orderDate: 1 }sorts the documents in each partition byorderDatein ascending order (1), so the earliestorderDateis first.
outputsets thestdDevPopQuantityForStatefield to thequantitypopulation standard deviation value using$stdDevPopthat is run in a documents window.The window contains documents between an
unboundedlower limit and thecurrentdocument in the output. This means$stdDevPopreturns thequantitypopulation standard deviation value for the documents between the beginning of the partition and the current document.
In this example output, the
quantitypopulation standard deviation value forCAandWAis shown in thestdDevPopQuantityForStatefield:{ _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 }