mirror of https://github.com/mongodb/mongo
SERVER-110906: Fix incorrect test description in complex match swap test (#41451)
GitOrigin-RevId: a341f68e54a43fd6fea549bee23733a04212f270
This commit is contained in:
parent
6740d09120
commit
f371d41b4c
|
|
@ -146,6 +146,14 @@ try {
|
||||||
pipeline = [{$project: {_id: 0, a: "$b.c", z: 1}}, {$match: {$expr: {$eq: ["$a", 42]}}}];
|
pipeline = [{$project: {_id: 0, a: "$b.c", z: 1}}, {$match: {$expr: {$eq: ["$a", 42]}}}];
|
||||||
runPipeline(testCaseName, pipeline);
|
runPipeline(testCaseName, pipeline);
|
||||||
|
|
||||||
|
testCaseName = "$match can be pushed beneath $replaceRoot";
|
||||||
|
pipeline = [{$replaceRoot: {newRoot: "$b"}}, {$match: {c: {$eq: 42}}}];
|
||||||
|
runPipeline(testCaseName, pipeline);
|
||||||
|
|
||||||
|
testCaseName = "$match can be pushed beneath $replaceWith";
|
||||||
|
pipeline = [{$replaceWith: "$b"}, {$match: {c: {$eq: 42}}}];
|
||||||
|
runPipeline(testCaseName, pipeline);
|
||||||
|
|
||||||
//
|
//
|
||||||
// The remaining test cases are negative tests, meaning that we do not expect the $match to be
|
// The remaining test cases are negative tests, meaning that we do not expect the $match to be
|
||||||
// pushed down.
|
// pushed down.
|
||||||
|
|
@ -201,14 +209,6 @@ try {
|
||||||
pipeline = [{$project: {a: "$b.c.f.g", z: 1}}, {$match: {a: {$eq: 9}}}];
|
pipeline = [{$project: {a: "$b.c.f.g", z: 1}}, {$match: {a: {$eq: 9}}}];
|
||||||
runPipeline(testCaseName, pipeline);
|
runPipeline(testCaseName, pipeline);
|
||||||
|
|
||||||
testCaseName = "Negative case: $match cannot be pushed beneath $replaceRoot";
|
|
||||||
pipeline = [{$replaceRoot: {newRoot: "$b"}}, {$match: {c: {$eq: 42}}}];
|
|
||||||
runPipeline(testCaseName, pipeline);
|
|
||||||
|
|
||||||
testCaseName = "Negative case: $match cannot be pushed beneath $replaceWith";
|
|
||||||
pipeline = [{$replaceWith: "$b"}, {$match: {c: {$eq: 42}}}];
|
|
||||||
runPipeline(testCaseName, pipeline);
|
|
||||||
|
|
||||||
testCaseName = "Negative case: $match cannot swap past complex rename when matching on subfield of $group key";
|
testCaseName = "Negative case: $match cannot swap past complex rename when matching on subfield of $group key";
|
||||||
pipeline = [{$group: {_id: {x: "$b.c"}}}, {$match: {"_id.x.e": {$lte: 42}}}];
|
pipeline = [{$group: {_id: {x: "$b.c"}}}, {$match: {"_id.x.e": {$lte: 42}}}];
|
||||||
runPipeline(testCaseName, pipeline);
|
runPipeline(testCaseName, pipeline);
|
||||||
|
|
|
||||||
|
|
@ -731,387 +731,7 @@
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
## 21. Negative case: Dotted path on the left and the right
|
## 21. $match can be pushed beneath $replaceRoot
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$project" : { "_id" : 0, "x.y" : "$b.c", "z" : 1 } }, { "$match" : { "x.y" : { "$lte" : 42 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "x" : { "y" : 42 }, "z" : 11 }
|
|
||||||
{ "x" : { "y" : 42 }, "z" : 14 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$project" : {
|
|
||||||
"z" : true,
|
|
||||||
"x" : {
|
|
||||||
"y" : "$b.c"
|
|
||||||
},
|
|
||||||
"_id" : false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"x.y" : {
|
|
||||||
"$lte" : 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 22. Negative case: Dotted path on the left and the right with match on a subpath of the renamed path
|
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$project" : { "_id" : 0, "x.y" : "$b.c", "z" : 1 } }, { "$match" : { "x.y.e" : { "$lte" : 42 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "x" : { "y" : { "e" : 42, "f" : "bar" } }, "z" : 15 }
|
|
||||||
{ "x" : { "y" : { "e" : 42, "f" : { "g" : 9 } } }, "z" : 16 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$project" : {
|
|
||||||
"z" : true,
|
|
||||||
"x" : {
|
|
||||||
"y" : "$b.c"
|
|
||||||
},
|
|
||||||
"_id" : false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"x.y.e" : {
|
|
||||||
"$lte" : 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 23. Negative case: Dotted path of length 3 on the left
|
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$project" : { "_id" : 0, "n.q.r" : "$b.c", "z" : 1 } }, { "$match" : { "n.q.r.e" : { "$lte" : 42 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "n" : { "q" : { "r" : { "e" : 42, "f" : "bar" } } }, "z" : 15 }
|
|
||||||
{ "n" : { "q" : { "r" : { "e" : 42, "f" : { "g" : 9 } } } }, "z" : 16 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$project" : {
|
|
||||||
"z" : true,
|
|
||||||
"n" : {
|
|
||||||
"q" : {
|
|
||||||
"r" : "$b.c"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"_id" : false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"n.q.r.e" : {
|
|
||||||
"$lte" : 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 24. Negative case: Dotted path of length 3 on the left, expressed with nested objects
|
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$project" : { "_id" : 0, "n" : { "q" : { "r" : "$b.c" } }, "z" : 1 } }, { "$match" : { "n.q.r.e" : { "$lte" : 42 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "n" : { "q" : { "r" : { "e" : 42, "f" : "bar" } } }, "z" : 15 }
|
|
||||||
{ "n" : { "q" : { "r" : { "e" : 42, "f" : { "g" : 9 } } } }, "z" : 16 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$project" : {
|
|
||||||
"z" : true,
|
|
||||||
"n" : {
|
|
||||||
"q" : {
|
|
||||||
"r" : "$b.c"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"_id" : false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"n.q.r.e" : {
|
|
||||||
"$lte" : 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 25. Negative case: Dotted path of length 3 on the left, expressed with nested objects and $addFields
|
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$addFields" : { "n" : { "q" : { "r" : "$b.c" } } } }, { "$match" : { "n.q.r.e" : { "$lte" : 42 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "_id" : 5, "b" : { "c" : { "e" : 42, "f" : "bar" } }, "h" : { "i" : 15 }, "n" : { "q" : { "r" : { "e" : 42, "f" : "bar" } } }, "z" : 15 }
|
|
||||||
{ "_id" : 6, "b" : { "c" : { "e" : 42, "f" : { "g" : 9 } }, "d" : "foo" }, "h" : { "i" : 16 }, "n" : { "q" : { "r" : { "e" : 42, "f" : { "g" : 9 } } } }, "z" : 16 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$addFields" : {
|
|
||||||
"n" : {
|
|
||||||
"q" : {
|
|
||||||
"r" : "$b.c"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"n.q.r.e" : {
|
|
||||||
"$lte" : 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 26. Negative case: conditional projection
|
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$project" : { "a" : { "$cond" : { "if" : { "$eq" : [ null, "$b.c" ] }, "then" : "$$REMOVE", "else" : "$b.c" } } } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "_id" : 1, "a" : 42 }
|
|
||||||
{ "_id" : 4, "a" : 42 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$project" : {
|
|
||||||
"_id" : true,
|
|
||||||
"a" : {
|
|
||||||
"$cond" : [
|
|
||||||
{
|
|
||||||
"$eq" : [
|
|
||||||
{
|
|
||||||
"$const" : null
|
|
||||||
},
|
|
||||||
"$b.c"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"$$REMOVE",
|
|
||||||
"$b.c"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"a" : {
|
|
||||||
"$eq" : 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 27. Negative case: field path of length 3
|
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$project" : { "_id" : 1, "a" : "$b.c.e", "z" : 1 } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "_id" : 5, "a" : 42, "z" : 15 }
|
|
||||||
{ "_id" : 6, "a" : 42, "z" : 16 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$project" : {
|
|
||||||
"_id" : true,
|
|
||||||
"z" : true,
|
|
||||||
"a" : "$b.c.e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"a" : {
|
|
||||||
"$eq" : 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 28. Negative case: field path of length 3 with _id excluded (variation 1)
|
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$project" : { "_id" : 0, "a" : "$b.c.e", "z" : 1 } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "a" : 42, "z" : 15 }
|
|
||||||
{ "a" : 42, "z" : 16 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$project" : {
|
|
||||||
"z" : true,
|
|
||||||
"a" : "$b.c.e",
|
|
||||||
"_id" : false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"a" : {
|
|
||||||
"$eq" : 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 29. Negative case: field path of length 3 with _id excluded (variation 2)
|
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$project" : { "_id" : 0, "a" : "$b.c.e" } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "a" : 42 }
|
|
||||||
{ "a" : 42 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$project" : {
|
|
||||||
"a" : "$b.c.e",
|
|
||||||
"_id" : false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"a" : {
|
|
||||||
"$eq" : 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 30. Negative case: $addFields with field path of length 3
|
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$addFields" : { "a" : "$b.c.e" } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "_id" : 5, "a" : 42, "b" : { "c" : { "e" : 42, "f" : "bar" } }, "h" : { "i" : 15 }, "z" : 15 }
|
|
||||||
{ "_id" : 6, "a" : 42, "b" : { "c" : { "e" : 42, "f" : { "g" : 9 } }, "d" : "foo" }, "h" : { "i" : 16 }, "z" : 16 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$addFields" : {
|
|
||||||
"a" : "$b.c.e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"a" : {
|
|
||||||
"$eq" : 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 31. Negative case: $set with field path of length 3
|
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$set" : { "a" : "$b.c.e" } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "_id" : 5, "a" : 42, "b" : { "c" : { "e" : 42, "f" : "bar" } }, "h" : { "i" : 15 }, "z" : 15 }
|
|
||||||
{ "_id" : 6, "a" : 42, "b" : { "c" : { "e" : 42, "f" : { "g" : 9 } }, "d" : "foo" }, "h" : { "i" : 16 }, "z" : 16 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$set" : {
|
|
||||||
"a" : "$b.c.e"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"a" : {
|
|
||||||
"$eq" : 42
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 32. Negative case: field path of length 4
|
|
||||||
### Pipeline
|
|
||||||
```json
|
|
||||||
[ { "$project" : { "a" : "$b.c.f.g", "z" : 1 } }, { "$match" : { "a" : { "$eq" : 9 } } } ]
|
|
||||||
```
|
|
||||||
### Results
|
|
||||||
```json
|
|
||||||
{ "_id" : 6, "a" : 9, "z" : 16 }
|
|
||||||
```
|
|
||||||
### Explain
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"$project" : {
|
|
||||||
"_id" : true,
|
|
||||||
"z" : true,
|
|
||||||
"a" : "$b.c.f.g"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$match" : {
|
|
||||||
"a" : {
|
|
||||||
"$eq" : 9
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 33. Negative case: $match cannot be pushed beneath $replaceRoot
|
|
||||||
### Pipeline
|
### Pipeline
|
||||||
```json
|
```json
|
||||||
[ { "$replaceRoot" : { "newRoot" : "$b" } }, { "$match" : { "c" : { "$eq" : 42 } } } ]
|
[ { "$replaceRoot" : { "newRoot" : "$b" } }, { "$match" : { "c" : { "$eq" : 42 } } } ]
|
||||||
|
|
@ -1159,7 +779,7 @@
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
## 34. Negative case: $match cannot be pushed beneath $replaceWith
|
## 22. $match can be pushed beneath $replaceWith
|
||||||
### Pipeline
|
### Pipeline
|
||||||
```json
|
```json
|
||||||
[ { "$replaceWith" : "$b" }, { "$match" : { "c" : { "$eq" : 42 } } } ]
|
[ { "$replaceWith" : "$b" }, { "$match" : { "c" : { "$eq" : 42 } } } ]
|
||||||
|
|
@ -1207,6 +827,386 @@
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 23. Negative case: Dotted path on the left and the right
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$project" : { "_id" : 0, "x.y" : "$b.c", "z" : 1 } }, { "$match" : { "x.y" : { "$lte" : 42 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "x" : { "y" : 42 }, "z" : 11 }
|
||||||
|
{ "x" : { "y" : 42 }, "z" : 14 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$project" : {
|
||||||
|
"z" : true,
|
||||||
|
"x" : {
|
||||||
|
"y" : "$b.c"
|
||||||
|
},
|
||||||
|
"_id" : false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"x.y" : {
|
||||||
|
"$lte" : 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 24. Negative case: Dotted path on the left and the right with match on a subpath of the renamed path
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$project" : { "_id" : 0, "x.y" : "$b.c", "z" : 1 } }, { "$match" : { "x.y.e" : { "$lte" : 42 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "x" : { "y" : { "e" : 42, "f" : "bar" } }, "z" : 15 }
|
||||||
|
{ "x" : { "y" : { "e" : 42, "f" : { "g" : 9 } } }, "z" : 16 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$project" : {
|
||||||
|
"z" : true,
|
||||||
|
"x" : {
|
||||||
|
"y" : "$b.c"
|
||||||
|
},
|
||||||
|
"_id" : false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"x.y.e" : {
|
||||||
|
"$lte" : 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 25. Negative case: Dotted path of length 3 on the left
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$project" : { "_id" : 0, "n.q.r" : "$b.c", "z" : 1 } }, { "$match" : { "n.q.r.e" : { "$lte" : 42 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "n" : { "q" : { "r" : { "e" : 42, "f" : "bar" } } }, "z" : 15 }
|
||||||
|
{ "n" : { "q" : { "r" : { "e" : 42, "f" : { "g" : 9 } } } }, "z" : 16 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$project" : {
|
||||||
|
"z" : true,
|
||||||
|
"n" : {
|
||||||
|
"q" : {
|
||||||
|
"r" : "$b.c"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"_id" : false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"n.q.r.e" : {
|
||||||
|
"$lte" : 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 26. Negative case: Dotted path of length 3 on the left, expressed with nested objects
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$project" : { "_id" : 0, "n" : { "q" : { "r" : "$b.c" } }, "z" : 1 } }, { "$match" : { "n.q.r.e" : { "$lte" : 42 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "n" : { "q" : { "r" : { "e" : 42, "f" : "bar" } } }, "z" : 15 }
|
||||||
|
{ "n" : { "q" : { "r" : { "e" : 42, "f" : { "g" : 9 } } } }, "z" : 16 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$project" : {
|
||||||
|
"z" : true,
|
||||||
|
"n" : {
|
||||||
|
"q" : {
|
||||||
|
"r" : "$b.c"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"_id" : false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"n.q.r.e" : {
|
||||||
|
"$lte" : 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 27. Negative case: Dotted path of length 3 on the left, expressed with nested objects and $addFields
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$addFields" : { "n" : { "q" : { "r" : "$b.c" } } } }, { "$match" : { "n.q.r.e" : { "$lte" : 42 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "_id" : 5, "b" : { "c" : { "e" : 42, "f" : "bar" } }, "h" : { "i" : 15 }, "n" : { "q" : { "r" : { "e" : 42, "f" : "bar" } } }, "z" : 15 }
|
||||||
|
{ "_id" : 6, "b" : { "c" : { "e" : 42, "f" : { "g" : 9 } }, "d" : "foo" }, "h" : { "i" : 16 }, "n" : { "q" : { "r" : { "e" : 42, "f" : { "g" : 9 } } } }, "z" : 16 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$addFields" : {
|
||||||
|
"n" : {
|
||||||
|
"q" : {
|
||||||
|
"r" : "$b.c"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"n.q.r.e" : {
|
||||||
|
"$lte" : 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 28. Negative case: conditional projection
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$project" : { "a" : { "$cond" : { "if" : { "$eq" : [ null, "$b.c" ] }, "then" : "$$REMOVE", "else" : "$b.c" } } } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "_id" : 1, "a" : 42 }
|
||||||
|
{ "_id" : 4, "a" : 42 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$project" : {
|
||||||
|
"_id" : true,
|
||||||
|
"a" : {
|
||||||
|
"$cond" : [
|
||||||
|
{
|
||||||
|
"$eq" : [
|
||||||
|
{
|
||||||
|
"$const" : null
|
||||||
|
},
|
||||||
|
"$b.c"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"$$REMOVE",
|
||||||
|
"$b.c"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"a" : {
|
||||||
|
"$eq" : 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 29. Negative case: field path of length 3
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$project" : { "_id" : 1, "a" : "$b.c.e", "z" : 1 } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "_id" : 5, "a" : 42, "z" : 15 }
|
||||||
|
{ "_id" : 6, "a" : 42, "z" : 16 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$project" : {
|
||||||
|
"_id" : true,
|
||||||
|
"z" : true,
|
||||||
|
"a" : "$b.c.e"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"a" : {
|
||||||
|
"$eq" : 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 30. Negative case: field path of length 3 with _id excluded (variation 1)
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$project" : { "_id" : 0, "a" : "$b.c.e", "z" : 1 } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "a" : 42, "z" : 15 }
|
||||||
|
{ "a" : 42, "z" : 16 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$project" : {
|
||||||
|
"z" : true,
|
||||||
|
"a" : "$b.c.e",
|
||||||
|
"_id" : false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"a" : {
|
||||||
|
"$eq" : 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 31. Negative case: field path of length 3 with _id excluded (variation 2)
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$project" : { "_id" : 0, "a" : "$b.c.e" } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "a" : 42 }
|
||||||
|
{ "a" : 42 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$project" : {
|
||||||
|
"a" : "$b.c.e",
|
||||||
|
"_id" : false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"a" : {
|
||||||
|
"$eq" : 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 32. Negative case: $addFields with field path of length 3
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$addFields" : { "a" : "$b.c.e" } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "_id" : 5, "a" : 42, "b" : { "c" : { "e" : 42, "f" : "bar" } }, "h" : { "i" : 15 }, "z" : 15 }
|
||||||
|
{ "_id" : 6, "a" : 42, "b" : { "c" : { "e" : 42, "f" : { "g" : 9 } }, "d" : "foo" }, "h" : { "i" : 16 }, "z" : 16 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$addFields" : {
|
||||||
|
"a" : "$b.c.e"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"a" : {
|
||||||
|
"$eq" : 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 33. Negative case: $set with field path of length 3
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$set" : { "a" : "$b.c.e" } }, { "$match" : { "a" : { "$eq" : 42 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "_id" : 5, "a" : 42, "b" : { "c" : { "e" : 42, "f" : "bar" } }, "h" : { "i" : 15 }, "z" : 15 }
|
||||||
|
{ "_id" : 6, "a" : 42, "b" : { "c" : { "e" : 42, "f" : { "g" : 9 } }, "d" : "foo" }, "h" : { "i" : 16 }, "z" : 16 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$set" : {
|
||||||
|
"a" : "$b.c.e"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"a" : {
|
||||||
|
"$eq" : 42
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 34. Negative case: field path of length 4
|
||||||
|
### Pipeline
|
||||||
|
```json
|
||||||
|
[ { "$project" : { "a" : "$b.c.f.g", "z" : 1 } }, { "$match" : { "a" : { "$eq" : 9 } } } ]
|
||||||
|
```
|
||||||
|
### Results
|
||||||
|
```json
|
||||||
|
{ "_id" : 6, "a" : 9, "z" : 16 }
|
||||||
|
```
|
||||||
|
### Explain
|
||||||
|
```json
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"$project" : {
|
||||||
|
"_id" : true,
|
||||||
|
"z" : true,
|
||||||
|
"a" : "$b.c.f.g"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$match" : {
|
||||||
|
"a" : {
|
||||||
|
"$eq" : 9
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
## 35. Negative case: $match cannot swap past complex rename when matching on subfield of $group key
|
## 35. Negative case: $match cannot swap past complex rename when matching on subfield of $group key
|
||||||
### Pipeline
|
### Pipeline
|
||||||
```json
|
```json
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue