-
Type: Bug
-
Resolution: Unresolved
-
Priority: Major - P3
-
None
-
Affects Version/s: None
-
Component/s: Aggregation Framework, Querying
-
Labels:
-
Query Optimization
-
ALL
In expressions such as $let which assign a value to a variable, the aggregation system errors when the variable name conflicts with a system variable or is otherwise illegal:
> db.c.drop(); > db.c.insert({_id: 1}); > db.c.aggregate([{$project: {foo: {$let: {vars: {"FOO": 3}, in: "$$FOO"}}}}]) assert: command failed: { "operationTime" : Timestamp(0, 0), "ok" : 0, "errmsg" : "'FOO' starts with an invalid character for a user variable name", "code" : 16867, "codeName" : "Location16867" } : aggregate failed > db.c.aggregate([{$project: {foo: {$let: {vars: {"Foo": 3}, in: "$$Foo"}}}}]) assert: command failed: { "operationTime" : Timestamp(0, 0), "ok" : 0, "errmsg" : "'Foo' starts with an invalid character for a user variable name", "code" : 16867, "codeName" : "Location16867" } : aggregate failed > db.c.aggregate([{$project: {foo: {$let: {vars: {"%blah": 3}, in: "$$%blah"}}}}]) assert: command failed: { "operationTime" : Timestamp(0, 0), "ok" : 0, "errmsg" : "'%blah' starts with an invalid character for a user variable name", "code" : 16867, "codeName" : "Location16867" } : aggregate failed > db.c.aggregate([{$project: {foo: {$let: {vars: {"ROOT": 3}, in: "$$ROOT"}}}}]) assert: command failed: { "operationTime" : Timestamp(0, 0), "ok" : 0, "errmsg" : "'ROOT' starts with an invalid character for a user variable name", "code" : 16867, "codeName" : "Location16867" } : aggregate failed
However, a user can write an agg pipeline which assigns to $$CURRENT. This should not be legal:
> db.c.aggregate([{$project: {foo: {$let: {vars: {"CURRENT": 3}, in: "$$CURRENT"}}}}]) { "_id" : 1, "foo" : 3 }
We should also consider whether it is correct to expose $$CURRENT to user pipelines at all. Usually $$CURRENT acts as an alias for $$ROOT, but it has a special internal use in the implementation of $redact. Arguably exposing $$CURRENT is a mistake, since its special meaning is an implementation detail for the $redact stage.