mongo/jstests/aggregation/expressions/max_min.js

99 lines
2.8 KiB
JavaScript

/*
* Tests $max and $min when used as aggregation expressions.
*/
let coll = db.collection;
assert(coll.drop());
coll.insertOne({
"int1": 5,
"int2": 10,
"str1": "hello",
"str2": "hello world",
"NaN": NaN,
"arr1": [5],
"arr2": [1, 2, 3],
"arr3": [1, 2, "string", null],
"arr4": [],
"arrNest1": [[1, 2]],
"arrNest2": [
[1, 2],
[3, 4],
],
"arrNest3": [[[1, 2, 3]]],
"arrNest4": [[[1, 2, 3]], 1],
"arrMixed1": [[], "hello", ["c"]],
"arrMixed2": [[], "hello", ["c"], null],
"null": null,
"undefined1": [undefined],
"undefined2": [undefined, 2, "string"],
});
function assertResultMax(expected, params) {
assert.eq(expected, coll.aggregate({$project: {a: {$max: params}}}).toArray()[0].a);
}
function assertResultMin(expected, params) {
assert.eq(expected, coll.aggregate({$project: {a: {$min: params}}}).toArray()[0].a);
}
// Test single parameter.
assertResultMax(null, []);
assertResultMax(null, "$arr4");
assertResultMax(5, "$arr1");
assertResultMax(5, "$int1");
assertResultMax("hello", "$str1");
assertResultMax(NaN, "$NaN");
assertResultMax(null, "$null");
assertResultMin(null, []);
assertResultMin(null, "$arr4");
assertResultMin(5, "$arr1");
assertResultMin(5, "$int1");
assertResultMin("hello", "$str1");
assertResultMin(NaN, "$NaN");
assertResultMin(null, "$null");
// Test multiple parameters.
assertResultMax(10, ["$int2", "$int1"]);
assertResultMax("hello", ["$int2", "$int1", "$str1"]);
assertResultMax("hello world", ["$str1", "$str2"]);
assertResultMin(5, ["$int2", "$int1"]);
assertResultMin(5, ["$int2", "$int1", "$str1"]);
assertResultMin("hello", ["$str1", "$str2"]);
// Tests single array param.
assertResultMax(null, "$undefined1");
assertResultMax("string", "$undefined2");
assertResultMax(3, "$arr2");
assertResultMax("string", "$arr3");
assertResultMin(null, "$undefined1");
assertResultMin(2, "$undefined2");
assertResultMin(1, "$arr2");
assertResultMin(1, "$arr3");
// Test nested arrays.
assertResultMax([1, 2], "$arrNest1");
assertResultMax([3, 4], "$arrNest2");
assertResultMax([[1, 2, 3]], "$arrNest3");
assertResultMax([1, 2, 3], ["$arr2", []]);
assertResultMax([[1, 2, 3]], "$arrNest4");
assertResultMax(["c"], "$arrMixed1");
assertResultMax([[], "hello", ["c"], null], ["$arrMixed1", "$arrMixed2"]);
assertResultMin([1, 2], "$arrNest1");
assertResultMin([1, 2], "$arrNest2");
assertResultMin([[1, 2, 3]], "$arrNest3");
assertResultMin([], ["$arr2", []]);
assertResultMin(1, "$arrNest4");
assertResultMin("hello", "$arrMixed1");
assertResultMin([[], "hello", ["c"]], ["$arrMixed1", "$arrMixed2"]);
// Multiple null or undefined params
assertResultMax(null, [null, "$null", "$doesNotExist"], undefined);
assertResultMin(null, [null, "$null", "$doesNotExist"], undefined);
assert(coll.drop());