Files
mongo/jstests/aggregation/sources/group/group_by_expr.js
Alyssa Clark f35c5b707a SERVER-89729 Add more test cases for the combination of group + expr (#24132)
GitOrigin-RevId: 706a7d32f6e67ad631f0e771d0b9ab805a4292e6
2024-07-10 16:05:07 +00:00

89 lines
3.3 KiB
JavaScript

/*
* Test that $group works with $expr in _id and accumulator fields.
*/
import {resultsEq} from "jstests/aggregation/extras/utils.js";
const coll = db[jsTestName()];
coll.drop();
assert.commandWorked(coll.insert([{_id: 1, x: 1, y: 5}, {_id: 2, x: 2, y: 10}]));
// Test $expr in the '_id' field.
// '_id' with empty $expr.
let results = coll.aggregate([{$group: {_id: {$expr: {}}}}]).toArray();
assert(resultsEq([{_id: {}}], results), results);
// '_id' with top-level $expr and field name (error case).
assert.throwsWithCode(
() => coll.aggregate([{$group: {_id: {$expr: {$eq: ["$x", 1]}, secondGroupByField: "$y"}}}]),
15983);
assert.throwsWithCode(
() => coll.aggregate([{$group: {_id: {secondGroupByField: "$y", $expr: {$eq: ["$x", 1]}}}}]),
16410);
// '_id' with nested $expr and field name.
results = coll.aggregate([{
$group: {
_id: {
exprFieldName: {$expr: {$max: [{$expr: {$multiply: ["$x", 2]}}, 3]}},
secondGroupByField: "$y"
}
}
}])
.toArray();
assert(resultsEq(
[
{_id: {exprFieldName: 3, secondGroupByField: 5}},
{_id: {exprFieldName: 4, secondGroupByField: 10}}
],
results),
results);
// '_id' with non-empty constant scalar $expr.
results = coll.aggregate([{$group: {_id: {$expr: {$literal: "this is a string"}}}}]).toArray();
assert(resultsEq([{_id: "this is a string"}], results), results);
// '_id' with non-empty constant object $expr.
results = coll.aggregate([{$group: {_id: {$expr: {a: "b"}}}}]).toArray();
assert(resultsEq([{_id: {a: "b"}}], results), results);
// '_id' with non-empty non-constant $expr.
results = coll.aggregate([{$group: {_id: {$expr: {$multiply: ["$x", 10]}}}}]).toArray();
assert(resultsEq([{_id: 10}, {_id: 20}], results), results);
// Test $expr in an accumulator.
// $sum with empty $expr.
results = coll.aggregate([{$group: {_id: 1, sum: {$sum: {$expr: {}}}}}]).toArray();
assert(resultsEq([{_id: 1, sum: 0}], results), results);
// $sum with $expr and field name (error case).
assert.throwsWithCode(
() => coll.aggregate(
[{$group: {_id: 1, sum: {$sum: {$expr: {$eq: ["$x", 1]}, secondAccumulatorField: "$y"}}}}]),
15983);
assert.throwsWithCode(
() => coll.aggregate(
[{$group: {_id: 1, sum: {$sum: {secondAccumulatorField: "$y", $expr: {$eq: ["$x", 1]}}}}}]),
16410);
// $sum with non-empty constant scalar $expr.
results = coll.aggregate([{$group: {_id: 1, sum: {$sum: {$expr: {$literal: 5}}}}}]).toArray();
assert(resultsEq([{_id: 1, sum: 10}], results), results);
// $sum with non-empty constant object $expr.
results = coll.aggregate([{$group: {_id: 1, sum: {$sum: {$expr: {a: 5}}}}}]).toArray();
assert(resultsEq([{_id: 1, sum: 0}], results), results);
// $sum with non-empty non-constant $expr.
results =
coll.aggregate([{$group: {_id: 1, sum: {$sum: {$expr: {$add: ["$x", "$y"]}}}}}]).toArray();
assert(resultsEq([{_id: 1, sum: 18}], results), results);
// $sum with non-constant $expr with nested $expr.
results =
coll.aggregate([{
$group: {_id: 1, sum: {$sum: {$expr: {$add: ["$x", {$expr: {$multiply: ["$y", 2]}}]}}}}
}])
.toArray();
assert(resultsEq([{_id: 1, sum: 33}], results), results);