Files
mongo/jstests/aggregation/sources/setWindowFields/stddev.js
Zac 591928c619 SERVER-108478 JS formatted by prettier and remove clang-format (#39656)
GitOrigin-RevId: 6c8f6aded47f260aa4f7c231b17dae3302cb1e04
2025-08-21 17:27:09 +00:00

76 lines
2.4 KiB
JavaScript

/**
* Test that standard deviation works as a window function.
* @tags: [
* requires_fcv_81,
* ]
*/
import {seedWithTickerData, testAccumAgainstGroup} from "jstests/aggregation/extras/window_function_helpers.js";
const coll = db[jsTestName()];
coll.drop();
// Create a collection of tickers and prices.
const nDocsPerTicker = 10;
seedWithTickerData(coll, nDocsPerTicker);
// Run the suite of partition and bounds tests against the $stdDevPop function.
testAccumAgainstGroup(coll, "$stdDevPop");
// Run the suite of partition and bounds tests against the $stdDevSamp function.
testAccumAgainstGroup(coll, "$stdDevSamp");
// Test that $stdDevPop and $stdDevSamp return null for windows which do not contain numeric values.
let results = coll
.aggregate([
{$addFields: {str: "hiya"}},
{
$setWindowFields: {
sortBy: {ts: 1},
output: {
stdDevPop: {$stdDevPop: "$str", window: {documents: ["unbounded", "current"]}},
stdDevSamp: {$stdDevSamp: "$str", window: {documents: ["unbounded", "current"]}},
},
},
},
])
.toArray();
for (let index = 0; index < results.length; index++) {
assert.eq(null, results[index].stdDevPop);
assert.eq(null, results[index].stdDevSamp);
}
// Test leading non-finite value generates correct result.
for (let nonFinite of [NaN, Infinity]) {
assert.eq(true, coll.drop());
assert.commandWorked(
coll.insertMany([
{_id: 0, a: nonFinite},
{_id: 1, a: 1},
{_id: 2, a: 2},
{_id: 3, a: nonFinite},
]),
);
const cursor = coll.aggregate([
{
$setWindowFields: {
partitionBy: null,
sortBy: {_id: 1},
output: {
b: {$stdDevSamp: "$a", window: {documents: [1, 2]}},
c: {$stdDevPop: "$a", window: {documents: [1, 2]}},
},
},
},
{
$project: {
stdDevSamp: {$trunc: ["$b", 2]},
stdDevPop: {$trunc: ["$c", 2]},
_id: 0,
},
},
]);
let result = cursor.next();
assert.docEq({stdDevSamp: 0.7, stdDevPop: 0.5}, result, result);
result = cursor.next();
assert.docEq({stdDevSamp: null, stdDevPop: null}, result, result);
}