mirror of https://github.com/mongodb/mongo
90 lines
2.7 KiB
JavaScript
90 lines
2.7 KiB
JavaScript
// Test $bottomN expression.
|
|
/**
|
|
* @tags: [
|
|
* requires_fcv_83
|
|
* ]
|
|
*/
|
|
import "jstests/libs/query/sbe_assert_error_override.js";
|
|
|
|
import {assertErrorCode} from "jstests/aggregation/extras/utils.js";
|
|
|
|
let coll = db.bottomN_expr;
|
|
coll.drop();
|
|
|
|
// Need to have at least one document to ensure the pipeline executes
|
|
assert.commandWorked(coll.insert({}));
|
|
|
|
function testBottomNNoSort(n, inputArray, expArray) {
|
|
let pipeline = [{$project: {_id: 0, bottomN: {$bottomN: {n: n, input: inputArray}}}}];
|
|
assert.eq(coll.aggregate(pipeline).toArray(), [{bottomN: expArray}]);
|
|
}
|
|
|
|
function testBottomNWithSort(n, inputArray, sortBy, expArray) {
|
|
let pipeline = [{$project: {_id: 0, bottomN: {$bottomN: {n: n, input: inputArray, sortBy: sortBy}}}}];
|
|
assert.eq(coll.aggregate(pipeline).toArray(), [{bottomN: expArray}]);
|
|
}
|
|
|
|
// Testing without sort spec
|
|
testBottomNNoSort(0, [0, 1, 2, 3, 4], []);
|
|
testBottomNNoSort(2, [0, 1, 2, 3, 4], [3, 4]);
|
|
testBottomNNoSort(5, [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]);
|
|
testBottomNNoSort(10, [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]);
|
|
|
|
// Testing mixed types
|
|
testBottomNNoSort(2, [0, 1, 2, 3, 4, "a", "b", "c"], ["b", "c"]);
|
|
testBottomNNoSort(2, [0, "a", [1, "b"], {c: 2}, 0.5], [{c: 2}, [1, "b"]]);
|
|
|
|
// Testing with sort spec
|
|
testBottomNWithSort(2, [0, 1, 2, 3, 4], 1, [3, 4]);
|
|
testBottomNWithSort(2, [0, 1, 2, 3, 4], -1, [1, 0]);
|
|
testBottomNWithSort(2, [0, "a", [1, "b"], {c: 2}, 0.5], -1, [0.5, 0]);
|
|
|
|
// Testing nested types
|
|
testBottomNWithSort(
|
|
2,
|
|
[
|
|
[1, 2],
|
|
[3, [1, 1]],
|
|
[3, 6],
|
|
],
|
|
1,
|
|
[
|
|
[3, 6],
|
|
[3, [1, 1]],
|
|
],
|
|
);
|
|
testBottomNWithSort(
|
|
2,
|
|
[
|
|
{a: 1, b: 1},
|
|
{a: 2, b: 2},
|
|
{a: 2, b: 1},
|
|
],
|
|
{a: 1, b: -1}, // Ascending a then descending b
|
|
[
|
|
{a: 2, b: 2},
|
|
{a: 2, b: 1},
|
|
],
|
|
);
|
|
|
|
// Error cases
|
|
// BottomN requires an object
|
|
assertErrorCode(coll, [{$project: {x: {$bottomN: 0}}}], 7212117);
|
|
// N is required
|
|
assertErrorCode(coll, [{$project: {x: {$bottomN: {input: [1, 2, 3]}}}}], 7212119);
|
|
// Input is required
|
|
assertErrorCode(coll, [{$project: {x: {$bottomN: {n: 2}}}}], 7212120);
|
|
|
|
// First argument is not integral
|
|
assertErrorCode(coll, [{$project: {x: {$bottomN: {n: "2", input: [1, 2, 3]}}}}], 721214);
|
|
assertErrorCode(coll, [{$project: {x: {$bottomN: {n: 1.5, input: [1, 2, 3]}}}}], 721214);
|
|
// First argument is negative
|
|
assertErrorCode(coll, [{$project: {x: {$bottomN: {n: -1, input: [1, 2, 3]}}}}], 721216);
|
|
|
|
// Second argument is not an array
|
|
assertErrorCode(coll, [{$project: {x: {$bottomN: {n: 2, input: "one"}}}}], 721215);
|
|
assertErrorCode(coll, [{$project: {x: {$bottomN: {n: 2, input: 1}}}}], 721215);
|
|
|
|
// Third argument is not a sort spec
|
|
assertErrorCode(coll, [{$project: {x: {$bottomN: {n: 2, input: [1, 2, 3], sortBy: "a"}}}}], 2942507);
|