diff options
author | Hana Pearlman <hana.pearlman@mongodb.com> | 2022-11-08 13:40:35 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-11-08 14:57:34 +0000 |
commit | 6f0704c3988ddfc0acff2e3438413b46cf4840e8 (patch) | |
tree | 55a73b4aaef7dad94f6948279dbde437e6346a62 /jstests | |
parent | ac0a38a08ac02d83632b1d82b7c3c5b6e5276b41 (diff) | |
download | mongo-6f0704c3988ddfc0acff2e3438413b46cf4840e8.tar.gz |
SERVER-62329: Port simple projections tests to golden framework
Diffstat (limited to 'jstests')
-rw-r--r-- | jstests/noPassthrough/cqf_fallback.js | 4 | ||||
-rw-r--r-- | jstests/query_golden/exclusion_projection.js | 37 | ||||
-rw-r--r-- | jstests/query_golden/expected_output/exclusion_projection | 655 | ||||
-rw-r--r-- | jstests/query_golden/expected_output/inclusion_projection | 852 | ||||
-rw-r--r-- | jstests/query_golden/inclusion_projection.js | 45 | ||||
-rw-r--r-- | jstests/query_golden/libs/projection_helpers.js | 151 | ||||
-rw-r--r-- | jstests/query_golden/libs/utils.js | 24 |
7 files changed, 1768 insertions, 0 deletions
diff --git a/jstests/noPassthrough/cqf_fallback.js b/jstests/noPassthrough/cqf_fallback.js index 828de369c59..e0cfb85f3b6 100644 --- a/jstests/noPassthrough/cqf_fallback.js +++ b/jstests/noPassthrough/cqf_fallback.js @@ -131,6 +131,10 @@ assertNotSupportedByBonsai({find: coll.getName(), filter: {'a.0.b': 5}}); assertNotSupportedByBonsai({find: coll.getName(), filter: {}, projection: {'a.0': 1}}); assertNotSupportedByBonsai({find: coll.getName(), filter: {}, projection: {'a.5.c': 0}}); +// Positional projection is not supported. Note that this syntax is only possible in the projection +// of a find command. +assertNotSupportedByBonsai({find: coll.getName(), filter: {}, projection: {'a.$': 5}}, true); + // Test for unsupported expressions within a branching expression such as $or. assertNotSupportedByBonsai({find: coll.getName(), filter: {$or: [{'a.0': 5}, {a: 1}]}}); assertNotSupportedByBonsai({find: coll.getName(), filter: {$or: [{a: 5}, {a: {$mod: [4, 0]}}]}}); diff --git a/jstests/query_golden/exclusion_projection.js b/jstests/query_golden/exclusion_projection.js new file mode 100644 index 00000000000..78e3155650f --- /dev/null +++ b/jstests/query_golden/exclusion_projection.js @@ -0,0 +1,37 @@ +/** + * Tests simple exclusion projections. Note that there is overlap in coverage with + * jstests/cqf/projection.js; both tests will exist pending a decision about the future of golden + * jstesting for CQF. + */ + +(function() { +"use strict"; +load("jstests/query_golden/libs/projection_helpers.js"); + +const coll = db.cqf_exclusion_project; +const exclusionProjSpecs = [ + {a: 0}, + {a: 0, _id: 0}, + {a: 0, x: 0}, + + {"a.b": 0}, + {"a.b": 0, "a.c": 0}, + + {"a.b.c": 0}, + {"a.b.c": 0, "a.b.d": 0}, + + // This syntax is permitted and equivalent to the dotted notation. + {a: {b: 0}}, + // A mix of dotted syntax and nested syntax is permitted as well. + {a: {"b.c": {d: 0, e: 0}}}, +]; +runProjectionsAgainstColl(coll, getProjectionDocs(), [] /*no indexes*/, exclusionProjSpecs); + +const idExclusionProjectSpecs = [ + {_id: 0}, + {"_id.a": 0}, + {"_id.a": 0, "_id.b": 0}, + {"_id.a.b": 0}, +]; +runProjectionsAgainstColl(coll, getIdProjectionDocs(), [] /*no indexes*/, idExclusionProjectSpecs); +}()); diff --git a/jstests/query_golden/expected_output/exclusion_projection b/jstests/query_golden/expected_output/exclusion_projection new file mode 100644 index 00000000000..25fff093457 --- /dev/null +++ b/jstests/query_golden/expected_output/exclusion_projection @@ -0,0 +1,655 @@ + + +[jsTest] ---- +[jsTest] Resetting collection. Inserting docs: +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1, "a" : null } +{ "_id" : 10, "a" : { "c" : { "b" : 1 } } } +{ "_id" : 11, "a" : { "b" : 1, "c" : 1, "d" : 1 }, "x" : { "y" : 1, "z" : 1 } } +{ "_id" : 12, "a" : { "_id" : 1, "b" : 1 } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { "c" : null } } } +{ "_id" : 15, "a" : { "b" : { "c" : undefined } } } +{ "_id" : 16, "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "_id" : 17, "a" : { "b" : { "c" : "str", "d" : "str", "e" : "str" }, "f" : "str" }, "x" : "str" } +{ "_id" : 18, "a.b.c" : 1 } +{ "_id" : 19, "a" : "str", "a.b" : "str", "abc" : "str" } +{ "_id" : 2, "a" : undefined } +{ "_id" : 20, "a" : { "b" : 1 }, "a.b" : "str" } +{ "_id" : 21, "a" : { "bNot" : { "c" : 1 } } } +{ "_id" : 22, "a" : [ ], "x" : "str" } +{ "_id" : 23, "a" : [ "str" ] } +{ "_id" : 24, "a" : [ null ] } +{ "_id" : 25, "a" : [ null, null ] } +{ "_id" : 26, "a" : [ null, "str" ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ 1, 2 ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3, "x" : "str", "y" : "str" } +{ "_id" : 30, "a" : [ { "x" : "str" } ] } +{ "_id" : 31, "a" : [ { "c" : "str" } ] } +{ "_id" : 32, "a" : [ { "b" : null, "c" : 1 }, { "c" : 1 }, { "d" : 1 }, "str" ] } +{ "_id" : 33, "a" : { "b" : [ ], "x" : "str" } } +{ "_id" : 34, "a" : { "b" : [ "str" ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { "c" : null } ] } } +{ "_id" : 38, "a" : [ { "b" : { "x" : 1 } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4, "a" : "str", "b" : "str", "x" : "str", "y" : "str" } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { "c" : 1 } ] ], { "b" : 1 } ] } +{ "_id" : 41, "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "cNot" : "str", "d" : 4 }, { "c" : 5 } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "c" : 2, "d" : 3 }, "e" : 4 }, { "b" : { "c" : 5, "d" : 6 }, "e" : 7 } ] } +{ "_id" : 43, "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "_id" : 45, "a" : [ "str", { "b" : 1 }, { "c" : 1 }, { "b" : 1, "c" : 1, "d" : 1 } ], "x" : "str" } +{ "_id" : 46, "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ 1, { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ "str", { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "_id" : 6, "a" : { "b" : null, "c" : 1 } } +{ "_id" : 7, "a" : { "b" : undefined, "c" : 1 } } +{ "_id" : 8, "a" : { "c" : 1, "d" : 1 } } +{ "_id" : 9, "a" : { "d" : 1 } } +Collection count: 53 + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a" : 0 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1 } +{ "_id" : 10 } +{ "_id" : 11, "x" : { "y" : 1, "z" : 1 } } +{ "_id" : 12 } +{ "_id" : 13 } +{ "_id" : 14 } +{ "_id" : 15 } +{ "_id" : 16 } +{ "_id" : 17, "x" : "str" } +{ "_id" : 18, "a.b.c" : 1 } +{ "_id" : 19, "a.b" : "str", "abc" : "str" } +{ "_id" : 2 } +{ "_id" : 20, "a.b" : "str" } +{ "_id" : 21 } +{ "_id" : 22, "x" : "str" } +{ "_id" : 23 } +{ "_id" : 24 } +{ "_id" : 25 } +{ "_id" : 26 } +{ "_id" : 27 } +{ "_id" : 28 } +{ "_id" : 29 } +{ "_id" : 3, "x" : "str", "y" : "str" } +{ "_id" : 30 } +{ "_id" : 31 } +{ "_id" : 32 } +{ "_id" : 33 } +{ "_id" : 34 } +{ "_id" : 35 } +{ "_id" : 36 } +{ "_id" : 37 } +{ "_id" : 38 } +{ "_id" : 39 } +{ "_id" : 4, "b" : "str", "x" : "str", "y" : "str" } +{ "_id" : 40 } +{ "_id" : 41 } +{ "_id" : 42 } +{ "_id" : 43 } +{ "_id" : 44 } +{ "_id" : 45, "x" : "str" } +{ "_id" : 46 } +{ "_id" : 47 } +{ "_id" : 48 } +{ "_id" : 49 } +{ "_id" : 5 } +{ "_id" : 50 } +{ "_id" : 51 } +{ "_id" : 52 } +{ "_id" : 6 } +{ "_id" : 7 } +{ "_id" : 8 } +{ "_id" : 9 } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a" : 0, "_id" : 0 } } ] +[jsTest] ---- + +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ "a.b" : "str" } +{ "a.b" : "str", "abc" : "str" } +{ "a.b.c" : 1 } +{ "b" : "str", "x" : "str", "y" : "str" } +{ "x" : "str" } +{ "x" : "str" } +{ "x" : "str" } +{ "x" : "str", "y" : "str" } +{ "x" : { "y" : 1, "z" : 1 } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a" : 0, "x" : 0 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1 } +{ "_id" : 10 } +{ "_id" : 11 } +{ "_id" : 12 } +{ "_id" : 13 } +{ "_id" : 14 } +{ "_id" : 15 } +{ "_id" : 16 } +{ "_id" : 17 } +{ "_id" : 18, "a.b.c" : 1 } +{ "_id" : 19, "a.b" : "str", "abc" : "str" } +{ "_id" : 2 } +{ "_id" : 20, "a.b" : "str" } +{ "_id" : 21 } +{ "_id" : 22 } +{ "_id" : 23 } +{ "_id" : 24 } +{ "_id" : 25 } +{ "_id" : 26 } +{ "_id" : 27 } +{ "_id" : 28 } +{ "_id" : 29 } +{ "_id" : 3, "y" : "str" } +{ "_id" : 30 } +{ "_id" : 31 } +{ "_id" : 32 } +{ "_id" : 33 } +{ "_id" : 34 } +{ "_id" : 35 } +{ "_id" : 36 } +{ "_id" : 37 } +{ "_id" : 38 } +{ "_id" : 39 } +{ "_id" : 4, "b" : "str", "y" : "str" } +{ "_id" : 40 } +{ "_id" : 41 } +{ "_id" : 42 } +{ "_id" : 43 } +{ "_id" : 44 } +{ "_id" : 45 } +{ "_id" : 46 } +{ "_id" : 47 } +{ "_id" : 48 } +{ "_id" : 49 } +{ "_id" : 5 } +{ "_id" : 50 } +{ "_id" : 51 } +{ "_id" : 52 } +{ "_id" : 6 } +{ "_id" : 7 } +{ "_id" : 8 } +{ "_id" : 9 } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a.b" : 0 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1, "a" : null } +{ "_id" : 10, "a" : { "c" : { "b" : 1 } } } +{ "_id" : 11, "a" : { "c" : 1, "d" : 1 }, "x" : { "y" : 1, "z" : 1 } } +{ "_id" : 12, "a" : { "_id" : 1 } } +{ "_id" : 13, "a" : { } } +{ "_id" : 14, "a" : { } } +{ "_id" : 15, "a" : { } } +{ "_id" : 16, "a" : { } } +{ "_id" : 17, "a" : { "f" : "str" }, "x" : "str" } +{ "_id" : 18, "a.b.c" : 1 } +{ "_id" : 19, "a" : "str", "a.b" : "str", "abc" : "str" } +{ "_id" : 2, "a" : undefined } +{ "_id" : 20, "a" : { }, "a.b" : "str" } +{ "_id" : 21, "a" : { "bNot" : { "c" : 1 } } } +{ "_id" : 22, "a" : [ ], "x" : "str" } +{ "_id" : 23, "a" : [ "str" ] } +{ "_id" : 24, "a" : [ null ] } +{ "_id" : 25, "a" : [ null, null ] } +{ "_id" : 26, "a" : [ null, "str" ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ 1, 2 ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3, "x" : "str", "y" : "str" } +{ "_id" : 30, "a" : [ { "x" : "str" } ] } +{ "_id" : 31, "a" : [ { "c" : "str" } ] } +{ "_id" : 32, "a" : [ { "c" : 1 }, { "c" : 1 }, { "d" : 1 }, "str" ] } +{ "_id" : 33, "a" : { "x" : "str" } } +{ "_id" : 34, "a" : { } } +{ "_id" : 35, "a" : { } } +{ "_id" : 36, "a" : { } } +{ "_id" : 37, "a" : { } } +{ "_id" : 38, "a" : [ { } ] } +{ "_id" : 39, "a" : [ { } ] } +{ "_id" : 4, "a" : "str", "b" : "str", "x" : "str", "y" : "str" } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { "c" : 1 } ] ], { } ] } +{ "_id" : 41, "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { }, { } ] } +{ "_id" : 42, "a" : [ { "e" : 4 }, { "e" : 7 } ] } +{ "_id" : 43, "a" : { } } +{ "_id" : 44, "a" : { } } +{ "_id" : 45, "a" : [ "str", { }, { "c" : 1 }, { "c" : 1, "d" : 1 } ], "x" : "str" } +{ "_id" : 46, "a" : [ { }, { } ] } +{ "_id" : 47, "a" : [ { }, { } ] } +{ "_id" : 48, "a" : { } } +{ "_id" : 49, "a" : [ { }, { } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ 1, { }, { "c" : 2 }, "str" ] ] } +{ "_id" : 51, "a" : [ [ [ { } ] ] ] } +{ "_id" : 52, "a" : [ [ "str", { }, { "c" : 2 }, "str" ], [ [ { } ] ], [ { }, [ { } ], [ [ { } ] ] ] ] } +{ "_id" : 6, "a" : { "c" : 1 } } +{ "_id" : 7, "a" : { "c" : 1 } } +{ "_id" : 8, "a" : { "c" : 1, "d" : 1 } } +{ "_id" : 9, "a" : { "d" : 1 } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a.b" : 0, "a.c" : 0 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1, "a" : null } +{ "_id" : 10, "a" : { } } +{ "_id" : 11, "a" : { "d" : 1 }, "x" : { "y" : 1, "z" : 1 } } +{ "_id" : 12, "a" : { "_id" : 1 } } +{ "_id" : 13, "a" : { } } +{ "_id" : 14, "a" : { } } +{ "_id" : 15, "a" : { } } +{ "_id" : 16, "a" : { } } +{ "_id" : 17, "a" : { "f" : "str" }, "x" : "str" } +{ "_id" : 18, "a.b.c" : 1 } +{ "_id" : 19, "a" : "str", "a.b" : "str", "abc" : "str" } +{ "_id" : 2, "a" : undefined } +{ "_id" : 20, "a" : { }, "a.b" : "str" } +{ "_id" : 21, "a" : { "bNot" : { "c" : 1 } } } +{ "_id" : 22, "a" : [ ], "x" : "str" } +{ "_id" : 23, "a" : [ "str" ] } +{ "_id" : 24, "a" : [ null ] } +{ "_id" : 25, "a" : [ null, null ] } +{ "_id" : 26, "a" : [ null, "str" ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ 1, 2 ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3, "x" : "str", "y" : "str" } +{ "_id" : 30, "a" : [ { "x" : "str" } ] } +{ "_id" : 31, "a" : [ { } ] } +{ "_id" : 32, "a" : [ { }, { }, { "d" : 1 }, "str" ] } +{ "_id" : 33, "a" : { "x" : "str" } } +{ "_id" : 34, "a" : { } } +{ "_id" : 35, "a" : { } } +{ "_id" : 36, "a" : { } } +{ "_id" : 37, "a" : { } } +{ "_id" : 38, "a" : [ { } ] } +{ "_id" : 39, "a" : [ { } ] } +{ "_id" : 4, "a" : "str", "b" : "str", "x" : "str", "y" : "str" } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { } ] ], { } ] } +{ "_id" : 41, "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { }, { } ] } +{ "_id" : 42, "a" : [ { "e" : 4 }, { "e" : 7 } ] } +{ "_id" : 43, "a" : { } } +{ "_id" : 44, "a" : { } } +{ "_id" : 45, "a" : [ "str", { }, { }, { "d" : 1 } ], "x" : "str" } +{ "_id" : 46, "a" : [ { }, { } ] } +{ "_id" : 47, "a" : [ { }, { } ] } +{ "_id" : 48, "a" : { } } +{ "_id" : 49, "a" : [ { }, { } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ 1, { }, { }, "str" ] ] } +{ "_id" : 51, "a" : [ [ [ { } ] ] ] } +{ "_id" : 52, "a" : [ [ "str", { }, { }, "str" ], [ [ { } ] ], [ { }, [ { } ], [ [ { } ] ] ] ] } +{ "_id" : 6, "a" : { } } +{ "_id" : 7, "a" : { } } +{ "_id" : 8, "a" : { "d" : 1 } } +{ "_id" : 9, "a" : { "d" : 1 } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a.b.c" : 0 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1, "a" : null } +{ "_id" : 10, "a" : { "c" : { "b" : 1 } } } +{ "_id" : 11, "a" : { "b" : 1, "c" : 1, "d" : 1 }, "x" : { "y" : 1, "z" : 1 } } +{ "_id" : 12, "a" : { "_id" : 1, "b" : 1 } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { } } } +{ "_id" : 15, "a" : { "b" : { } } } +{ "_id" : 16, "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "_id" : 17, "a" : { "b" : { "d" : "str", "e" : "str" }, "f" : "str" }, "x" : "str" } +{ "_id" : 18, "a.b.c" : 1 } +{ "_id" : 19, "a" : "str", "a.b" : "str", "abc" : "str" } +{ "_id" : 2, "a" : undefined } +{ "_id" : 20, "a" : { "b" : 1 }, "a.b" : "str" } +{ "_id" : 21, "a" : { "bNot" : { "c" : 1 } } } +{ "_id" : 22, "a" : [ ], "x" : "str" } +{ "_id" : 23, "a" : [ "str" ] } +{ "_id" : 24, "a" : [ null ] } +{ "_id" : 25, "a" : [ null, null ] } +{ "_id" : 26, "a" : [ null, "str" ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ 1, 2 ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3, "x" : "str", "y" : "str" } +{ "_id" : 30, "a" : [ { "x" : "str" } ] } +{ "_id" : 31, "a" : [ { "c" : "str" } ] } +{ "_id" : 32, "a" : [ { "b" : null, "c" : 1 }, { "c" : 1 }, { "d" : 1 }, "str" ] } +{ "_id" : 33, "a" : { "b" : [ ], "x" : "str" } } +{ "_id" : 34, "a" : { "b" : [ "str" ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { } ] } } +{ "_id" : 38, "a" : [ { "b" : { "x" : 1 } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4, "a" : "str", "b" : "str", "x" : "str", "y" : "str" } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { "c" : 1 } ] ], { "b" : 1 } ] } +{ "_id" : 41, "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "d" : 3 }, { "cNot" : "str", "d" : 4 }, { } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "d" : 3 }, "e" : 4 }, { "b" : { "d" : 6 }, "e" : 7 } ] } +{ "_id" : 43, "a" : { "b" : [ { "d" : 1 }, { "d" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { } } } +{ "_id" : 45, "a" : [ "str", { "b" : 1 }, { "c" : 1 }, { "b" : 1, "c" : 1, "d" : 1 } ], "x" : "str" } +{ "_id" : 46, "a" : [ { "b" : [ { "d" : 1 }, { "d" : 2 } ] }, { "b" : [ { "d" : 3 }, { "d" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { } }, { "b" : { } } ] } +{ "_id" : 48, "a" : { "b" : [ { }, { } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "d" : 1 }, { "d" : 2 } ] }, { "b" : [ { "d" : 3 }, { "d" : 4 } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ 1, { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "d" : "str" } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ "str", { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "_id" : 6, "a" : { "b" : null, "c" : 1 } } +{ "_id" : 7, "a" : { "b" : undefined, "c" : 1 } } +{ "_id" : 8, "a" : { "c" : 1, "d" : 1 } } +{ "_id" : 9, "a" : { "d" : 1 } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a.b.c" : 0, "a.b.d" : 0 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1, "a" : null } +{ "_id" : 10, "a" : { "c" : { "b" : 1 } } } +{ "_id" : 11, "a" : { "b" : 1, "c" : 1, "d" : 1 }, "x" : { "y" : 1, "z" : 1 } } +{ "_id" : 12, "a" : { "_id" : 1, "b" : 1 } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { } } } +{ "_id" : 15, "a" : { "b" : { } } } +{ "_id" : 16, "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "_id" : 17, "a" : { "b" : { "e" : "str" }, "f" : "str" }, "x" : "str" } +{ "_id" : 18, "a.b.c" : 1 } +{ "_id" : 19, "a" : "str", "a.b" : "str", "abc" : "str" } +{ "_id" : 2, "a" : undefined } +{ "_id" : 20, "a" : { "b" : 1 }, "a.b" : "str" } +{ "_id" : 21, "a" : { "bNot" : { "c" : 1 } } } +{ "_id" : 22, "a" : [ ], "x" : "str" } +{ "_id" : 23, "a" : [ "str" ] } +{ "_id" : 24, "a" : [ null ] } +{ "_id" : 25, "a" : [ null, null ] } +{ "_id" : 26, "a" : [ null, "str" ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ 1, 2 ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3, "x" : "str", "y" : "str" } +{ "_id" : 30, "a" : [ { "x" : "str" } ] } +{ "_id" : 31, "a" : [ { "c" : "str" } ] } +{ "_id" : 32, "a" : [ { "b" : null, "c" : 1 }, { "c" : 1 }, { "d" : 1 }, "str" ] } +{ "_id" : 33, "a" : { "b" : [ ], "x" : "str" } } +{ "_id" : 34, "a" : { "b" : [ "str" ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { } ] } } +{ "_id" : 38, "a" : [ { "b" : { "x" : 1 } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4, "a" : "str", "b" : "str", "x" : "str", "y" : "str" } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { "c" : 1 } ] ], { "b" : 1 } ] } +{ "_id" : 41, "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { "b" : [ { "cNot" : "str" }, { "cNot" : "str" } ] }, { "b" : [ { }, { "cNot" : "str" }, { } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { }, "e" : 4 }, { "b" : { }, "e" : 7 } ] } +{ "_id" : 43, "a" : { "b" : [ { }, { } ] } } +{ "_id" : 44, "a" : { "b" : { } } } +{ "_id" : 45, "a" : [ "str", { "b" : 1 }, { "c" : 1 }, { "b" : 1, "c" : 1, "d" : 1 } ], "x" : "str" } +{ "_id" : 46, "a" : [ { "b" : [ { }, { } ] }, { "b" : [ { }, { } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { } }, { "b" : { } } ] } +{ "_id" : 48, "a" : { "b" : [ { }, { } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { }, { } ] }, { "b" : [ { }, { } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ 1, { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ "str", { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "_id" : 6, "a" : { "b" : null, "c" : 1 } } +{ "_id" : 7, "a" : { "b" : undefined, "c" : 1 } } +{ "_id" : 8, "a" : { "c" : 1, "d" : 1 } } +{ "_id" : 9, "a" : { "d" : 1 } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a" : { "b" : 0 } } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1, "a" : null } +{ "_id" : 10, "a" : { "c" : { "b" : 1 } } } +{ "_id" : 11, "a" : { "c" : 1, "d" : 1 }, "x" : { "y" : 1, "z" : 1 } } +{ "_id" : 12, "a" : { "_id" : 1 } } +{ "_id" : 13, "a" : { } } +{ "_id" : 14, "a" : { } } +{ "_id" : 15, "a" : { } } +{ "_id" : 16, "a" : { } } +{ "_id" : 17, "a" : { "f" : "str" }, "x" : "str" } +{ "_id" : 18, "a.b.c" : 1 } +{ "_id" : 19, "a" : "str", "a.b" : "str", "abc" : "str" } +{ "_id" : 2, "a" : undefined } +{ "_id" : 20, "a" : { }, "a.b" : "str" } +{ "_id" : 21, "a" : { "bNot" : { "c" : 1 } } } +{ "_id" : 22, "a" : [ ], "x" : "str" } +{ "_id" : 23, "a" : [ "str" ] } +{ "_id" : 24, "a" : [ null ] } +{ "_id" : 25, "a" : [ null, null ] } +{ "_id" : 26, "a" : [ null, "str" ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ 1, 2 ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3, "x" : "str", "y" : "str" } +{ "_id" : 30, "a" : [ { "x" : "str" } ] } +{ "_id" : 31, "a" : [ { "c" : "str" } ] } +{ "_id" : 32, "a" : [ { "c" : 1 }, { "c" : 1 }, { "d" : 1 }, "str" ] } +{ "_id" : 33, "a" : { "x" : "str" } } +{ "_id" : 34, "a" : { } } +{ "_id" : 35, "a" : { } } +{ "_id" : 36, "a" : { } } +{ "_id" : 37, "a" : { } } +{ "_id" : 38, "a" : [ { } ] } +{ "_id" : 39, "a" : [ { } ] } +{ "_id" : 4, "a" : "str", "b" : "str", "x" : "str", "y" : "str" } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { "c" : 1 } ] ], { } ] } +{ "_id" : 41, "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { }, { } ] } +{ "_id" : 42, "a" : [ { "e" : 4 }, { "e" : 7 } ] } +{ "_id" : 43, "a" : { } } +{ "_id" : 44, "a" : { } } +{ "_id" : 45, "a" : [ "str", { }, { "c" : 1 }, { "c" : 1, "d" : 1 } ], "x" : "str" } +{ "_id" : 46, "a" : [ { }, { } ] } +{ "_id" : 47, "a" : [ { }, { } ] } +{ "_id" : 48, "a" : { } } +{ "_id" : 49, "a" : [ { }, { } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ 1, { }, { "c" : 2 }, "str" ] ] } +{ "_id" : 51, "a" : [ [ [ { } ] ] ] } +{ "_id" : 52, "a" : [ [ "str", { }, { "c" : 2 }, "str" ], [ [ { } ] ], [ { }, [ { } ], [ [ { } ] ] ] ] } +{ "_id" : 6, "a" : { "c" : 1 } } +{ "_id" : 7, "a" : { "c" : 1 } } +{ "_id" : 8, "a" : { "c" : 1, "d" : 1 } } +{ "_id" : 9, "a" : { "d" : 1 } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a" : { "b.c" : { "d" : 0, "e" : 0 } } } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1, "a" : null } +{ "_id" : 10, "a" : { "c" : { "b" : 1 } } } +{ "_id" : 11, "a" : { "b" : 1, "c" : 1, "d" : 1 }, "x" : { "y" : 1, "z" : 1 } } +{ "_id" : 12, "a" : { "_id" : 1, "b" : 1 } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { "c" : null } } } +{ "_id" : 15, "a" : { "b" : { "c" : undefined } } } +{ "_id" : 16, "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "_id" : 17, "a" : { "b" : { "c" : "str", "d" : "str", "e" : "str" }, "f" : "str" }, "x" : "str" } +{ "_id" : 18, "a.b.c" : 1 } +{ "_id" : 19, "a" : "str", "a.b" : "str", "abc" : "str" } +{ "_id" : 2, "a" : undefined } +{ "_id" : 20, "a" : { "b" : 1 }, "a.b" : "str" } +{ "_id" : 21, "a" : { "bNot" : { "c" : 1 } } } +{ "_id" : 22, "a" : [ ], "x" : "str" } +{ "_id" : 23, "a" : [ "str" ] } +{ "_id" : 24, "a" : [ null ] } +{ "_id" : 25, "a" : [ null, null ] } +{ "_id" : 26, "a" : [ null, "str" ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ 1, 2 ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3, "x" : "str", "y" : "str" } +{ "_id" : 30, "a" : [ { "x" : "str" } ] } +{ "_id" : 31, "a" : [ { "c" : "str" } ] } +{ "_id" : 32, "a" : [ { "b" : null, "c" : 1 }, { "c" : 1 }, { "d" : 1 }, "str" ] } +{ "_id" : 33, "a" : { "b" : [ ], "x" : "str" } } +{ "_id" : 34, "a" : { "b" : [ "str" ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { "c" : null } ] } } +{ "_id" : 38, "a" : [ { "b" : { "x" : 1 } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4, "a" : "str", "b" : "str", "x" : "str", "y" : "str" } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { "c" : 1 } ] ], { "b" : 1 } ] } +{ "_id" : 41, "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "cNot" : "str", "d" : 4 }, { "c" : 5 } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "c" : 2, "d" : 3 }, "e" : 4 }, { "b" : { "c" : 5, "d" : 6 }, "e" : 7 } ] } +{ "_id" : 43, "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ 1, 2, { } ] } } } +{ "_id" : 45, "a" : [ "str", { "b" : 1 }, { "c" : 1 }, { "b" : 1, "c" : 1, "d" : 1 } ], "x" : "str" } +{ "_id" : 46, "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ 1, { } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ 1, { } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ 1, { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ "str", { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "_id" : 6, "a" : { "b" : null, "c" : 1 } } +{ "_id" : 7, "a" : { "b" : undefined, "c" : 1 } } +{ "_id" : 8, "a" : { "c" : 1, "d" : 1 } } +{ "_id" : 9, "a" : { "d" : 1 } } + + +[jsTest] ---- +[jsTest] Resetting collection. Inserting docs: +[jsTest] ---- + +{ "_id" : 1, "x" : 2 } +{ "_id" : { }, "x" : 1 } +{ "_id" : { "a" : 1, "b" : 2, "c" : 3 }, "x" : 4 } +{ "_id" : { "a" : 1, "c" : 2 }, "x" : 3 } +{ "_id" : { "a" : [ [ { "b" : { "c" : 1 }, "d" : 2 }, 3 ], 4 ], "e" : 5 }, "x" : 6 } +{ "_id" : { "a" : { "b" : { "c" : 1 }, "d" : 2 }, "e" : 3 }, "x" : 4 } +{ "_id" : { "x" : 1 }, "y" : 2 } +Collection count: 7 + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "_id" : 0 } } ] +[jsTest] ---- + +{ "x" : 1 } +{ "x" : 2 } +{ "x" : 3 } +{ "x" : 4 } +{ "x" : 4 } +{ "x" : 6 } +{ "y" : 2 } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "_id.a" : 0 } } ] +[jsTest] ---- + +{ "_id" : 1, "x" : 2 } +{ "_id" : { }, "x" : 1 } +{ "_id" : { "b" : 2, "c" : 3 }, "x" : 4 } +{ "_id" : { "c" : 2 }, "x" : 3 } +{ "_id" : { "e" : 3 }, "x" : 4 } +{ "_id" : { "e" : 5 }, "x" : 6 } +{ "_id" : { "x" : 1 }, "y" : 2 } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "_id.a" : 0, "_id.b" : 0 } } ] +[jsTest] ---- + +{ "_id" : 1, "x" : 2 } +{ "_id" : { }, "x" : 1 } +{ "_id" : { "c" : 2 }, "x" : 3 } +{ "_id" : { "c" : 3 }, "x" : 4 } +{ "_id" : { "e" : 3 }, "x" : 4 } +{ "_id" : { "e" : 5 }, "x" : 6 } +{ "_id" : { "x" : 1 }, "y" : 2 } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "_id.a.b" : 0 } } ] +[jsTest] ---- + +{ "_id" : 1, "x" : 2 } +{ "_id" : { }, "x" : 1 } +{ "_id" : { "a" : 1, "b" : 2, "c" : 3 }, "x" : 4 } +{ "_id" : { "a" : 1, "c" : 2 }, "x" : 3 } +{ "_id" : { "a" : [ [ { "d" : 2 }, 3 ], 4 ], "e" : 5 }, "x" : 6 } +{ "_id" : { "a" : { "d" : 2 }, "e" : 3 }, "x" : 4 } +{ "_id" : { "x" : 1 }, "y" : 2 } diff --git a/jstests/query_golden/expected_output/inclusion_projection b/jstests/query_golden/expected_output/inclusion_projection new file mode 100644 index 00000000000..81e63e80ac1 --- /dev/null +++ b/jstests/query_golden/expected_output/inclusion_projection @@ -0,0 +1,852 @@ + + +[jsTest] ---- +[jsTest] Resetting collection. Inserting docs: +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1, "a" : null } +{ "_id" : 10, "a" : { "c" : { "b" : 1 } } } +{ "_id" : 11, "a" : { "b" : 1, "c" : 1, "d" : 1 }, "x" : { "y" : 1, "z" : 1 } } +{ "_id" : 12, "a" : { "_id" : 1, "b" : 1 } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { "c" : null } } } +{ "_id" : 15, "a" : { "b" : { "c" : undefined } } } +{ "_id" : 16, "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "_id" : 17, "a" : { "b" : { "c" : "str", "d" : "str", "e" : "str" }, "f" : "str" }, "x" : "str" } +{ "_id" : 18, "a.b.c" : 1 } +{ "_id" : 19, "a" : "str", "a.b" : "str", "abc" : "str" } +{ "_id" : 2, "a" : undefined } +{ "_id" : 20, "a" : { "b" : 1 }, "a.b" : "str" } +{ "_id" : 21, "a" : { "bNot" : { "c" : 1 } } } +{ "_id" : 22, "a" : [ ], "x" : "str" } +{ "_id" : 23, "a" : [ "str" ] } +{ "_id" : 24, "a" : [ null ] } +{ "_id" : 25, "a" : [ null, null ] } +{ "_id" : 26, "a" : [ null, "str" ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ 1, 2 ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3, "x" : "str", "y" : "str" } +{ "_id" : 30, "a" : [ { "x" : "str" } ] } +{ "_id" : 31, "a" : [ { "c" : "str" } ] } +{ "_id" : 32, "a" : [ { "b" : null, "c" : 1 }, { "c" : 1 }, { "d" : 1 }, "str" ] } +{ "_id" : 33, "a" : { "b" : [ ], "x" : "str" } } +{ "_id" : 34, "a" : { "b" : [ "str" ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { "c" : null } ] } } +{ "_id" : 38, "a" : [ { "b" : { "x" : 1 } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4, "a" : "str", "b" : "str", "x" : "str", "y" : "str" } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { "c" : 1 } ] ], { "b" : 1 } ] } +{ "_id" : 41, "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "cNot" : "str", "d" : 4 }, { "c" : 5 } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "c" : 2, "d" : 3 }, "e" : 4 }, { "b" : { "c" : 5, "d" : 6 }, "e" : 7 } ] } +{ "_id" : 43, "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "_id" : 45, "a" : [ "str", { "b" : 1 }, { "c" : 1 }, { "b" : 1, "c" : 1, "d" : 1 } ], "x" : "str" } +{ "_id" : 46, "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ 1, { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ "str", { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "_id" : 6, "a" : { "b" : null, "c" : 1 } } +{ "_id" : 7, "a" : { "b" : undefined, "c" : 1 } } +{ "_id" : 8, "a" : { "c" : 1, "d" : 1 } } +{ "_id" : 9, "a" : { "d" : 1 } } +Collection count: 53 + +[jsTest] ---- +[jsTest] Creating indexes: +[jsTest] ---- + +{ "a" : -1 } +{ "a" : 1 } +{ "a.b" : 1 } +{ "a.b" : 1, "a.c" : 1 } +{ "a.b.c" : 1 } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a" : 1 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1, "a" : null } +{ "_id" : 10, "a" : { "c" : { "b" : 1 } } } +{ "_id" : 11, "a" : { "b" : 1, "c" : 1, "d" : 1 } } +{ "_id" : 12, "a" : { "_id" : 1, "b" : 1 } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { "c" : null } } } +{ "_id" : 15, "a" : { "b" : { "c" : undefined } } } +{ "_id" : 16, "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "_id" : 17, "a" : { "b" : { "c" : "str", "d" : "str", "e" : "str" }, "f" : "str" } } +{ "_id" : 18 } +{ "_id" : 19, "a" : "str" } +{ "_id" : 2, "a" : undefined } +{ "_id" : 20, "a" : { "b" : 1 } } +{ "_id" : 21, "a" : { "bNot" : { "c" : 1 } } } +{ "_id" : 22, "a" : [ ] } +{ "_id" : 23, "a" : [ "str" ] } +{ "_id" : 24, "a" : [ null ] } +{ "_id" : 25, "a" : [ null, null ] } +{ "_id" : 26, "a" : [ null, "str" ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ 1, 2 ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3 } +{ "_id" : 30, "a" : [ { "x" : "str" } ] } +{ "_id" : 31, "a" : [ { "c" : "str" } ] } +{ "_id" : 32, "a" : [ { "b" : null, "c" : 1 }, { "c" : 1 }, { "d" : 1 }, "str" ] } +{ "_id" : 33, "a" : { "b" : [ ], "x" : "str" } } +{ "_id" : 34, "a" : { "b" : [ "str" ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { "c" : null } ] } } +{ "_id" : 38, "a" : [ { "b" : { "x" : 1 } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4, "a" : "str" } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { "c" : 1 } ] ], { "b" : 1 } ] } +{ "_id" : 41, "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "cNot" : "str", "d" : 4 }, { "c" : 5 } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "c" : 2, "d" : 3 }, "e" : 4 }, { "b" : { "c" : 5, "d" : 6 }, "e" : 7 } ] } +{ "_id" : 43, "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "_id" : 45, "a" : [ "str", { "b" : 1 }, { "c" : 1 }, { "b" : 1, "c" : 1, "d" : 1 } ] } +{ "_id" : 46, "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ 1, { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ "str", { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "_id" : 6, "a" : { "b" : null, "c" : 1 } } +{ "_id" : 7, "a" : { "b" : undefined, "c" : 1 } } +{ "_id" : 8, "a" : { "c" : 1, "d" : 1 } } +{ "_id" : 9, "a" : { "d" : 1 } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a" : 1, "_id" : 1 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1, "a" : null } +{ "_id" : 10, "a" : { "c" : { "b" : 1 } } } +{ "_id" : 11, "a" : { "b" : 1, "c" : 1, "d" : 1 } } +{ "_id" : 12, "a" : { "_id" : 1, "b" : 1 } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { "c" : null } } } +{ "_id" : 15, "a" : { "b" : { "c" : undefined } } } +{ "_id" : 16, "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "_id" : 17, "a" : { "b" : { "c" : "str", "d" : "str", "e" : "str" }, "f" : "str" } } +{ "_id" : 18 } +{ "_id" : 19, "a" : "str" } +{ "_id" : 2, "a" : undefined } +{ "_id" : 20, "a" : { "b" : 1 } } +{ "_id" : 21, "a" : { "bNot" : { "c" : 1 } } } +{ "_id" : 22, "a" : [ ] } +{ "_id" : 23, "a" : [ "str" ] } +{ "_id" : 24, "a" : [ null ] } +{ "_id" : 25, "a" : [ null, null ] } +{ "_id" : 26, "a" : [ null, "str" ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ 1, 2 ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3 } +{ "_id" : 30, "a" : [ { "x" : "str" } ] } +{ "_id" : 31, "a" : [ { "c" : "str" } ] } +{ "_id" : 32, "a" : [ { "b" : null, "c" : 1 }, { "c" : 1 }, { "d" : 1 }, "str" ] } +{ "_id" : 33, "a" : { "b" : [ ], "x" : "str" } } +{ "_id" : 34, "a" : { "b" : [ "str" ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { "c" : null } ] } } +{ "_id" : 38, "a" : [ { "b" : { "x" : 1 } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4, "a" : "str" } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { "c" : 1 } ] ], { "b" : 1 } ] } +{ "_id" : 41, "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "cNot" : "str", "d" : 4 }, { "c" : 5 } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "c" : 2, "d" : 3 }, "e" : 4 }, { "b" : { "c" : 5, "d" : 6 }, "e" : 7 } ] } +{ "_id" : 43, "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "_id" : 45, "a" : [ "str", { "b" : 1 }, { "c" : 1 }, { "b" : 1, "c" : 1, "d" : 1 } ] } +{ "_id" : 46, "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ 1, { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ "str", { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "_id" : 6, "a" : { "b" : null, "c" : 1 } } +{ "_id" : 7, "a" : { "b" : undefined, "c" : 1 } } +{ "_id" : 8, "a" : { "c" : 1, "d" : 1 } } +{ "_id" : 9, "a" : { "d" : 1 } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a" : 1, "_id" : 0 } } ] +[jsTest] ---- + +{ } +{ } +{ } +{ "a" : "str" } +{ "a" : "str" } +{ "a" : [ "str" ] } +{ "a" : [ "str", { "b" : 1 }, { "c" : 1 }, { "b" : 1, "c" : 1, "d" : 1 } ] } +{ "a" : [ [ "str", { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "a" : [ [ 1, 2 ] ] } +{ "a" : [ [ 1, { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ] ] } +{ "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { "c" : 1 } ] ], { "b" : 1 } ] } +{ "a" : [ [ ], [ ] ] } +{ "a" : [ ] } +{ "a" : [ null ] } +{ "a" : [ null, "str" ] } +{ "a" : [ null, null ] } +{ "a" : [ { }, { } ] } +{ "a" : [ { "b" : [ { } ] } ] } +{ "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "a" : [ { "b" : null, "c" : 1 }, { "c" : 1 }, { "d" : 1 }, "str" ] } +{ "a" : [ { "b" : { "c" : 2, "d" : 3 }, "e" : 4 }, { "b" : { "c" : 5, "d" : 6 }, "e" : 7 } ] } +{ "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "a" : [ { "b" : { "x" : 1 } } ] } +{ "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "cNot" : "str", "d" : 4 }, { "c" : 5 } ] } ] } +{ "a" : [ { "c" : "str" } ] } +{ "a" : [ { "x" : "str" } ] } +{ "a" : null } +{ "a" : undefined } +{ "a" : { } } +{ "a" : { "_id" : 1, "b" : 1 } } +{ "a" : { "b" : 1 } } +{ "a" : { "b" : 1, "c" : 1, "d" : 1 } } +{ "a" : { "b" : [ "str" ] } } +{ "a" : { "b" : [ [ ] ] } } +{ "a" : { "b" : [ ], "x" : "str" } } +{ "a" : { "b" : [ { } ] } } +{ "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "a" : { "b" : [ { "c" : null } ] } } +{ "a" : { "b" : null, "c" : 1 } } +{ "a" : { "b" : undefined, "c" : 1 } } +{ "a" : { "b" : { } } } +{ "a" : { "b" : { "c" : "str", "d" : "str", "e" : "str" }, "f" : "str" } } +{ "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "a" : { "b" : { "c" : null } } } +{ "a" : { "b" : { "c" : undefined } } } +{ "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "a" : { "bNot" : { "c" : 1 } } } +{ "a" : { "c" : 1, "d" : 1 } } +{ "a" : { "c" : { "b" : 1 } } } +{ "a" : { "d" : 1 } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a" : 1, "x" : 1 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1, "a" : null } +{ "_id" : 10, "a" : { "c" : { "b" : 1 } } } +{ "_id" : 11, "a" : { "b" : 1, "c" : 1, "d" : 1 }, "x" : { "y" : 1, "z" : 1 } } +{ "_id" : 12, "a" : { "_id" : 1, "b" : 1 } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { "c" : null } } } +{ "_id" : 15, "a" : { "b" : { "c" : undefined } } } +{ "_id" : 16, "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "_id" : 17, "a" : { "b" : { "c" : "str", "d" : "str", "e" : "str" }, "f" : "str" }, "x" : "str" } +{ "_id" : 18 } +{ "_id" : 19, "a" : "str" } +{ "_id" : 2, "a" : undefined } +{ "_id" : 20, "a" : { "b" : 1 } } +{ "_id" : 21, "a" : { "bNot" : { "c" : 1 } } } +{ "_id" : 22, "a" : [ ], "x" : "str" } +{ "_id" : 23, "a" : [ "str" ] } +{ "_id" : 24, "a" : [ null ] } +{ "_id" : 25, "a" : [ null, null ] } +{ "_id" : 26, "a" : [ null, "str" ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ 1, 2 ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3, "x" : "str" } +{ "_id" : 30, "a" : [ { "x" : "str" } ] } +{ "_id" : 31, "a" : [ { "c" : "str" } ] } +{ "_id" : 32, "a" : [ { "b" : null, "c" : 1 }, { "c" : 1 }, { "d" : 1 }, "str" ] } +{ "_id" : 33, "a" : { "b" : [ ], "x" : "str" } } +{ "_id" : 34, "a" : { "b" : [ "str" ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { "c" : null } ] } } +{ "_id" : 38, "a" : [ { "b" : { "x" : 1 } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4, "a" : "str", "x" : "str" } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ 1 ], [ { "c" : 1 } ] ], { "b" : 1 } ] } +{ "_id" : 41, "a" : [ { "bNot" : [ { "c" : "str" }, { "c" : "str" } ] }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "cNot" : "str", "d" : 4 }, { "c" : 5 } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "c" : 2, "d" : 3 }, "e" : 4 }, { "b" : { "c" : 5, "d" : 6 }, "e" : 7 } ] } +{ "_id" : 43, "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "_id" : 45, "a" : [ "str", { "b" : 1 }, { "c" : 1 }, { "b" : 1, "c" : 1, "d" : 1 } ], "x" : "str" } +{ "_id" : 46, "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ 1, { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ "str", { "b" : 1 }, { "b" : 2, "c" : 2 }, "str" ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "_id" : 6, "a" : { "b" : null, "c" : 1 } } +{ "_id" : 7, "a" : { "b" : undefined, "c" : 1 } } +{ "_id" : 8, "a" : { "c" : 1, "d" : 1 } } +{ "_id" : 9, "a" : { "d" : 1 } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a.b" : 1 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1 } +{ "_id" : 10, "a" : { } } +{ "_id" : 11, "a" : { "b" : 1 } } +{ "_id" : 12, "a" : { "b" : 1 } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { "c" : null } } } +{ "_id" : 15, "a" : { "b" : { "c" : undefined } } } +{ "_id" : 16, "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "_id" : 17, "a" : { "b" : { "c" : "str", "d" : "str", "e" : "str" } } } +{ "_id" : 18 } +{ "_id" : 19 } +{ "_id" : 2 } +{ "_id" : 20, "a" : { "b" : 1 } } +{ "_id" : 21, "a" : { } } +{ "_id" : 22, "a" : [ ] } +{ "_id" : 23, "a" : [ ] } +{ "_id" : 24, "a" : [ ] } +{ "_id" : 25, "a" : [ ] } +{ "_id" : 26, "a" : [ ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3 } +{ "_id" : 30, "a" : [ { } ] } +{ "_id" : 31, "a" : [ { } ] } +{ "_id" : 32, "a" : [ { "b" : null }, { }, { } ] } +{ "_id" : 33, "a" : { "b" : [ ] } } +{ "_id" : 34, "a" : { "b" : [ "str" ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { "c" : null } ] } } +{ "_id" : 38, "a" : [ { "b" : { "x" : 1 } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4 } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ ], [ { } ] ], { "b" : 1 } ] } +{ "_id" : 41, "a" : [ { }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "cNot" : "str", "d" : 4 }, { "c" : 5 } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "c" : 2, "d" : 3 } }, { "b" : { "c" : 5, "d" : 6 } } ] } +{ "_id" : 43, "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "_id" : 45, "a" : [ { "b" : 1 }, { }, { "b" : 1 } ] } +{ "_id" : 46, "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ { "b" : 1 }, { "b" : 2 } ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ { "b" : 1 }, { "b" : 2 } ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "_id" : 6, "a" : { "b" : null } } +{ "_id" : 7, "a" : { "b" : undefined } } +{ "_id" : 8, "a" : { } } +{ "_id" : 9, "a" : { } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a.b" : 1, "_id" : 0 } } ] +[jsTest] ---- + +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "a" : [ [ ] ] } +{ "a" : [ [ ], [ [ ], [ ], [ ], [ { } ] ], { "b" : 1 } ] } +{ "a" : [ [ ], [ ] ] } +{ "a" : [ [ { "b" : 1 }, { "b" : 2 } ] ] } +{ "a" : [ [ { "b" : 1 }, { "b" : 2 } ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "a" : [ ] } +{ "a" : [ ] } +{ "a" : [ ] } +{ "a" : [ ] } +{ "a" : [ ] } +{ "a" : [ { } ] } +{ "a" : [ { } ] } +{ "a" : [ { }, { } ] } +{ "a" : [ { }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "cNot" : "str", "d" : 4 }, { "c" : 5 } ] } ] } +{ "a" : [ { "b" : 1 }, { }, { "b" : 1 } ] } +{ "a" : [ { "b" : [ { } ] } ] } +{ "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "a" : [ { "b" : null }, { }, { } ] } +{ "a" : [ { "b" : { "c" : 2, "d" : 3 } }, { "b" : { "c" : 5, "d" : 6 } } ] } +{ "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "a" : [ { "b" : { "x" : 1 } } ] } +{ "a" : { } } +{ "a" : { } } +{ "a" : { } } +{ "a" : { } } +{ "a" : { } } +{ "a" : { "b" : 1 } } +{ "a" : { "b" : 1 } } +{ "a" : { "b" : 1 } } +{ "a" : { "b" : [ "str" ] } } +{ "a" : { "b" : [ [ ] ] } } +{ "a" : { "b" : [ ] } } +{ "a" : { "b" : [ { } ] } } +{ "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "a" : { "b" : [ { "c" : null } ] } } +{ "a" : { "b" : null } } +{ "a" : { "b" : undefined } } +{ "a" : { "b" : { } } } +{ "a" : { "b" : { "c" : "str", "d" : "str", "e" : "str" } } } +{ "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "a" : { "b" : { "c" : null } } } +{ "a" : { "b" : { "c" : undefined } } } +{ "a" : { "b" : { "x" : 1, "y" : 1 } } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a.b" : 1, "a.c" : 1 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1 } +{ "_id" : 10, "a" : { "c" : { "b" : 1 } } } +{ "_id" : 11, "a" : { "b" : 1, "c" : 1 } } +{ "_id" : 12, "a" : { "b" : 1 } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { "c" : null } } } +{ "_id" : 15, "a" : { "b" : { "c" : undefined } } } +{ "_id" : 16, "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "_id" : 17, "a" : { "b" : { "c" : "str", "d" : "str", "e" : "str" } } } +{ "_id" : 18 } +{ "_id" : 19 } +{ "_id" : 2 } +{ "_id" : 20, "a" : { "b" : 1 } } +{ "_id" : 21, "a" : { } } +{ "_id" : 22, "a" : [ ] } +{ "_id" : 23, "a" : [ ] } +{ "_id" : 24, "a" : [ ] } +{ "_id" : 25, "a" : [ ] } +{ "_id" : 26, "a" : [ ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3 } +{ "_id" : 30, "a" : [ { } ] } +{ "_id" : 31, "a" : [ { "c" : "str" } ] } +{ "_id" : 32, "a" : [ { "b" : null, "c" : 1 }, { "c" : 1 }, { } ] } +{ "_id" : 33, "a" : { "b" : [ ] } } +{ "_id" : 34, "a" : { "b" : [ "str" ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { "c" : null } ] } } +{ "_id" : 38, "a" : [ { "b" : { "x" : 1 } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4 } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ ], [ { "c" : 1 } ] ], { "b" : 1 } ] } +{ "_id" : 41, "a" : [ { }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "cNot" : "str", "d" : 4 }, { "c" : 5 } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "c" : 2, "d" : 3 } }, { "b" : { "c" : 5, "d" : 6 } } ] } +{ "_id" : 43, "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "_id" : 45, "a" : [ { "b" : 1 }, { "c" : 1 }, { "b" : 1, "c" : 1 } ] } +{ "_id" : 46, "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ { "b" : 1 }, { "b" : 2, "c" : 2 } ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ { "b" : 1 }, { "b" : 2, "c" : 2 } ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "_id" : 6, "a" : { "b" : null, "c" : 1 } } +{ "_id" : 7, "a" : { "b" : undefined, "c" : 1 } } +{ "_id" : 8, "a" : { "c" : 1 } } +{ "_id" : 9, "a" : { } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a.b.c" : 1 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1 } +{ "_id" : 10, "a" : { } } +{ "_id" : 11, "a" : { } } +{ "_id" : 12, "a" : { } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { "c" : null } } } +{ "_id" : 15, "a" : { "b" : { "c" : undefined } } } +{ "_id" : 16, "a" : { "b" : { } } } +{ "_id" : 17, "a" : { "b" : { "c" : "str" } } } +{ "_id" : 18 } +{ "_id" : 19 } +{ "_id" : 2 } +{ "_id" : 20, "a" : { } } +{ "_id" : 21, "a" : { } } +{ "_id" : 22, "a" : [ ] } +{ "_id" : 23, "a" : [ ] } +{ "_id" : 24, "a" : [ ] } +{ "_id" : 25, "a" : [ ] } +{ "_id" : 26, "a" : [ ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3 } +{ "_id" : 30, "a" : [ { } ] } +{ "_id" : 31, "a" : [ { } ] } +{ "_id" : 32, "a" : [ { }, { }, { } ] } +{ "_id" : 33, "a" : { "b" : [ ] } } +{ "_id" : 34, "a" : { "b" : [ ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { "c" : null } ] } } +{ "_id" : 38, "a" : [ { "b" : { } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4 } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ ], [ { } ] ], { } ] } +{ "_id" : 41, "a" : [ { }, { "b" : [ { }, { } ] }, { "b" : [ { "c" : 3 }, { }, { "c" : 5 } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "c" : 2 } }, { "b" : { "c" : 5 } } ] } +{ "_id" : 43, "a" : { "b" : [ { "c" : 1 }, { "c" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "_id" : 45, "a" : [ { }, { }, { } ] } +{ "_id" : 46, "a" : [ { "b" : [ { "c" : 1 }, { "c" : 2 } ] }, { "b" : [ { "c" : 3 }, { "c" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ] }, { "c" : [ 2, 3, 4 ] } ] }, { "b" : [ { "c" : [ 3, 4, 5 ] }, { "c" : [ 4, 5, 6 ] } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ { }, { } ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ] } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ { }, { } ], [ [ { } ] ], [ { }, [ { } ], [ [ { "b" : [ ] } ] ] ] ] } +{ "_id" : 6, "a" : { } } +{ "_id" : 7, "a" : { } } +{ "_id" : 8, "a" : { } } +{ "_id" : 9, "a" : { } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a.b.c" : 1, "_id" : 0 } } ] +[jsTest] ---- + +{ } +{ } +{ } +{ } +{ } +{ } +{ } +{ "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ] } ] ] ] } ] ] ] } +{ "a" : [ [ ] ] } +{ "a" : [ [ ], [ [ ], [ ], [ ], [ { } ] ], { } ] } +{ "a" : [ [ ], [ ] ] } +{ "a" : [ [ { }, { } ] ] } +{ "a" : [ [ { }, { } ], [ [ { } ] ], [ { }, [ { } ], [ [ { "b" : [ ] } ] ] ] ] } +{ "a" : [ ] } +{ "a" : [ ] } +{ "a" : [ ] } +{ "a" : [ ] } +{ "a" : [ ] } +{ "a" : [ { } ] } +{ "a" : [ { } ] } +{ "a" : [ { }, { } ] } +{ "a" : [ { }, { }, { } ] } +{ "a" : [ { }, { }, { } ] } +{ "a" : [ { }, { "b" : [ { }, { } ] }, { "b" : [ { "c" : 3 }, { }, { "c" : 5 } ] } ] } +{ "a" : [ { "b" : [ { } ] } ] } +{ "a" : [ { "b" : [ { "c" : 1 }, { "c" : 2 } ] }, { "b" : [ { "c" : 3 }, { "c" : 4 } ] } ] } +{ "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ] }, { "c" : [ 2, 3, 4 ] } ] }, { "b" : [ { "c" : [ 3, 4, 5 ] }, { "c" : [ 4, 5, 6 ] } ] } ] } +{ "a" : [ { "b" : { } } ] } +{ "a" : [ { "b" : { "c" : 2 } }, { "b" : { "c" : 5 } } ] } +{ "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "a" : { } } +{ "a" : { } } +{ "a" : { } } +{ "a" : { } } +{ "a" : { } } +{ "a" : { } } +{ "a" : { } } +{ "a" : { } } +{ "a" : { } } +{ "a" : { } } +{ "a" : { "b" : [ [ ] ] } } +{ "a" : { "b" : [ ] } } +{ "a" : { "b" : [ ] } } +{ "a" : { "b" : [ { } ] } } +{ "a" : { "b" : [ { "c" : 1 }, { "c" : 2 } ] } } +{ "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "a" : { "b" : [ { "c" : null } ] } } +{ "a" : { "b" : { } } } +{ "a" : { "b" : { } } } +{ "a" : { "b" : { "c" : "str" } } } +{ "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "a" : { "b" : { "c" : null } } } +{ "a" : { "b" : { "c" : undefined } } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a.b.c" : 1, "a.b.d" : 1 } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1 } +{ "_id" : 10, "a" : { } } +{ "_id" : 11, "a" : { } } +{ "_id" : 12, "a" : { } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { "c" : null } } } +{ "_id" : 15, "a" : { "b" : { "c" : undefined } } } +{ "_id" : 16, "a" : { "b" : { } } } +{ "_id" : 17, "a" : { "b" : { "c" : "str", "d" : "str" } } } +{ "_id" : 18 } +{ "_id" : 19 } +{ "_id" : 2 } +{ "_id" : 20, "a" : { } } +{ "_id" : 21, "a" : { } } +{ "_id" : 22, "a" : [ ] } +{ "_id" : 23, "a" : [ ] } +{ "_id" : 24, "a" : [ ] } +{ "_id" : 25, "a" : [ ] } +{ "_id" : 26, "a" : [ ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3 } +{ "_id" : 30, "a" : [ { } ] } +{ "_id" : 31, "a" : [ { } ] } +{ "_id" : 32, "a" : [ { }, { }, { } ] } +{ "_id" : 33, "a" : { "b" : [ ] } } +{ "_id" : 34, "a" : { "b" : [ ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { "c" : null } ] } } +{ "_id" : 38, "a" : [ { "b" : { } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4 } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ ], [ { } ] ], { } ] } +{ "_id" : 41, "a" : [ { }, { "b" : [ { "d" : 1 }, { "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "d" : 4 }, { "c" : 5 } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "c" : 2, "d" : 3 } }, { "b" : { "c" : 5, "d" : 6 } } ] } +{ "_id" : 43, "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "_id" : 45, "a" : [ { }, { }, { } ] } +{ "_id" : 46, "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ { }, { } ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ { }, { } ], [ [ { } ] ], [ { }, [ { } ], [ [ { "b" : [ ] } ] ] ] ] } +{ "_id" : 6, "a" : { } } +{ "_id" : 7, "a" : { } } +{ "_id" : 8, "a" : { } } +{ "_id" : 9, "a" : { } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a" : { "b" : 1 } } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1 } +{ "_id" : 10, "a" : { } } +{ "_id" : 11, "a" : { "b" : 1 } } +{ "_id" : 12, "a" : { "b" : 1 } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { "c" : null } } } +{ "_id" : 15, "a" : { "b" : { "c" : undefined } } } +{ "_id" : 16, "a" : { "b" : { "x" : 1, "y" : 1 } } } +{ "_id" : 17, "a" : { "b" : { "c" : "str", "d" : "str", "e" : "str" } } } +{ "_id" : 18 } +{ "_id" : 19 } +{ "_id" : 2 } +{ "_id" : 20, "a" : { "b" : 1 } } +{ "_id" : 21, "a" : { } } +{ "_id" : 22, "a" : [ ] } +{ "_id" : 23, "a" : [ ] } +{ "_id" : 24, "a" : [ ] } +{ "_id" : 25, "a" : [ ] } +{ "_id" : 26, "a" : [ ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3 } +{ "_id" : 30, "a" : [ { } ] } +{ "_id" : 31, "a" : [ { } ] } +{ "_id" : 32, "a" : [ { "b" : null }, { }, { } ] } +{ "_id" : 33, "a" : { "b" : [ ] } } +{ "_id" : 34, "a" : { "b" : [ "str" ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { "c" : null } ] } } +{ "_id" : 38, "a" : [ { "b" : { "x" : 1 } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4 } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ ], [ { } ] ], { "b" : 1 } ] } +{ "_id" : 41, "a" : [ { }, { "b" : [ { "cNot" : "str", "d" : 1 }, { "cNot" : "str", "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "cNot" : "str", "d" : 4 }, { "c" : 5 } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { "c" : 2, "d" : 3 } }, { "b" : { "c" : 5, "d" : 6 } } ] } +{ "_id" : 43, "a" : { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ 1, 2, { "d" : 3 } ] } } } +{ "_id" : 45, "a" : [ { "b" : 1 }, { }, { "b" : 1 } ] } +{ "_id" : 46, "a" : [ { "b" : [ { "c" : 1, "d" : 1 }, { "c" : 2, "d" : 2 } ] }, { "b" : [ { "c" : 3, "d" : 3 }, { "c" : 4, "d" : 4 } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ 1, { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ 1, { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ 1, 2, 3 ], "d" : 1 }, { "c" : [ 2, 3, 4 ], "d" : 2 } ] }, { "b" : [ { "c" : [ 3, 4, 5 ], "d" : 3 }, { "c" : [ 4, 5, 6 ], "d" : 4 } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ { "b" : 1 }, { "b" : 2 } ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ "str" ] ] ], "d" : "str" } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ { "b" : 1 }, { "b" : 2 } ], [ [ { "b" : 1 } ] ], [ { "b" : 1 }, [ { "b" : 2 } ], [ [ { "b" : [ 2 ] } ] ] ] ] } +{ "_id" : 6, "a" : { "b" : null } } +{ "_id" : 7, "a" : { "b" : undefined } } +{ "_id" : 8, "a" : { } } +{ "_id" : 9, "a" : { } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "a" : { "b.c" : { "d" : 1, "e" : 1 } } } } ] +[jsTest] ---- + +{ "_id" : 0 } +{ "_id" : 1 } +{ "_id" : 10, "a" : { } } +{ "_id" : 11, "a" : { } } +{ "_id" : 12, "a" : { } } +{ "_id" : 13, "a" : { "b" : { } } } +{ "_id" : 14, "a" : { "b" : { } } } +{ "_id" : 15, "a" : { "b" : { } } } +{ "_id" : 16, "a" : { "b" : { } } } +{ "_id" : 17, "a" : { "b" : { } } } +{ "_id" : 18 } +{ "_id" : 19 } +{ "_id" : 2 } +{ "_id" : 20, "a" : { } } +{ "_id" : 21, "a" : { } } +{ "_id" : 22, "a" : [ ] } +{ "_id" : 23, "a" : [ ] } +{ "_id" : 24, "a" : [ ] } +{ "_id" : 25, "a" : [ ] } +{ "_id" : 26, "a" : [ ] } +{ "_id" : 27, "a" : [ [ ], [ ] ] } +{ "_id" : 28, "a" : [ [ ] ] } +{ "_id" : 29, "a" : [ { }, { } ] } +{ "_id" : 3 } +{ "_id" : 30, "a" : [ { } ] } +{ "_id" : 31, "a" : [ { } ] } +{ "_id" : 32, "a" : [ { }, { }, { } ] } +{ "_id" : 33, "a" : { "b" : [ ] } } +{ "_id" : 34, "a" : { "b" : [ ] } } +{ "_id" : 35, "a" : { "b" : [ [ ] ] } } +{ "_id" : 36, "a" : { "b" : [ { } ] } } +{ "_id" : 37, "a" : { "b" : [ { } ] } } +{ "_id" : 38, "a" : [ { "b" : { } } ] } +{ "_id" : 39, "a" : [ { "b" : [ { } ] } ] } +{ "_id" : 4 } +{ "_id" : 40, "a" : [ [ ], [ [ ], [ ], [ ], [ { } ] ], { } ] } +{ "_id" : 41, "a" : [ { }, { "b" : [ { }, { } ] }, { "b" : [ { }, { }, { } ] } ] } +{ "_id" : 42, "a" : [ { "b" : { } }, { "b" : { } } ] } +{ "_id" : 43, "a" : { "b" : [ { }, { } ] } } +{ "_id" : 44, "a" : { "b" : { "c" : [ { "d" : 3 } ] } } } +{ "_id" : 45, "a" : [ { }, { }, { } ] } +{ "_id" : 46, "a" : [ { "b" : [ { }, { } ] }, { "b" : [ { }, { } ] } ] } +{ "_id" : 47, "a" : [ { "b" : { "c" : [ { "d" : 1 } ] } }, { "b" : { "c" : [ ] } } ] } +{ "_id" : 48, "a" : { "b" : [ { "c" : [ { "d" : 1 } ] }, { "c" : [ ] } ] } } +{ "_id" : 49, "a" : [ { "b" : [ { "c" : [ ] }, { "c" : [ ] } ] }, { "b" : [ { "c" : [ ] }, { "c" : [ ] } ] } ] } +{ "_id" : 5, "a" : { } } +{ "_id" : 50, "a" : [ [ { }, { } ] ] } +{ "_id" : 51, "a" : [ [ [ { "b" : [ [ [ { "c" : [ [ [ ] ] ] } ] ] ] } ] ] ] } +{ "_id" : 52, "a" : [ [ { }, { } ], [ [ { } ] ], [ { }, [ { } ], [ [ { "b" : [ ] } ] ] ] ] } +{ "_id" : 6, "a" : { } } +{ "_id" : 7, "a" : { } } +{ "_id" : 8, "a" : { } } +{ "_id" : 9, "a" : { } } + + +[jsTest] ---- +[jsTest] Resetting collection. Inserting docs: +[jsTest] ---- + +{ "_id" : 1, "x" : 2 } +{ "_id" : { }, "x" : 1 } +{ "_id" : { "a" : 1, "b" : 2, "c" : 3 }, "x" : 4 } +{ "_id" : { "a" : 1, "c" : 2 }, "x" : 3 } +{ "_id" : { "a" : [ [ { "b" : { "c" : 1 }, "d" : 2 }, 3 ], 4 ], "e" : 5 }, "x" : 6 } +{ "_id" : { "a" : { "b" : { "c" : 1 }, "d" : 2 }, "e" : 3 }, "x" : 4 } +{ "_id" : { "x" : 1 }, "y" : 2 } +Collection count: 7 + +[jsTest] ---- +[jsTest] Creating indexes: +[jsTest] ---- + +{ "_id.a" : 1 } +{ "_id.a" : 1, "_id.b" : 1 } +{ "_id.a.b" : 1 } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "_id" : 1 } } ] +[jsTest] ---- + +{ "_id" : 1 } +{ "_id" : { } } +{ "_id" : { "a" : 1, "b" : 2, "c" : 3 } } +{ "_id" : { "a" : 1, "c" : 2 } } +{ "_id" : { "a" : [ [ { "b" : { "c" : 1 }, "d" : 2 }, 3 ], 4 ], "e" : 5 } } +{ "_id" : { "a" : { "b" : { "c" : 1 }, "d" : 2 }, "e" : 3 } } +{ "_id" : { "x" : 1 } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "_id.a" : 1 } } ] +[jsTest] ---- + +{ } +{ "_id" : { } } +{ "_id" : { } } +{ "_id" : { "a" : 1 } } +{ "_id" : { "a" : 1 } } +{ "_id" : { "a" : [ [ { "b" : { "c" : 1 }, "d" : 2 }, 3 ], 4 ] } } +{ "_id" : { "a" : { "b" : { "c" : 1 }, "d" : 2 } } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "_id.a" : 1, "_id.b" : 1 } } ] +[jsTest] ---- + +{ } +{ "_id" : { } } +{ "_id" : { } } +{ "_id" : { "a" : 1 } } +{ "_id" : { "a" : 1, "b" : 2 } } +{ "_id" : { "a" : [ [ { "b" : { "c" : 1 }, "d" : 2 }, 3 ], 4 ] } } +{ "_id" : { "a" : { "b" : { "c" : 1 }, "d" : 2 } } } + + +[jsTest] ---- +[jsTest] Query: [ { "$project" : { "_id.a.b" : 1 } } ] +[jsTest] ---- + +{ } +{ "_id" : { } } +{ "_id" : { } } +{ "_id" : { } } +{ "_id" : { } } +{ "_id" : { "a" : [ [ { "b" : { "c" : 1 } } ] ] } } +{ "_id" : { "a" : { "b" : { "c" : 1 } } } } diff --git a/jstests/query_golden/inclusion_projection.js b/jstests/query_golden/inclusion_projection.js new file mode 100644 index 00000000000..295785e82fb --- /dev/null +++ b/jstests/query_golden/inclusion_projection.js @@ -0,0 +1,45 @@ +/** + * Tests simple inclusion projections. Note that there is overlap in coverage with + * jstests/cqf/projection.js; both tests will exist pending a decision about the future of golden + * jstesting for CQF. + */ + +(function() { +"use strict"; +load("jstests/query_golden/libs/projection_helpers.js"); + +const coll = db.cqf_inclusion_project; + +const inclusionProjSpecs = [ + {a: 1}, + {a: 1, _id: 1}, + {a: 1, _id: 0}, + {a: 1, x: 1}, + + {"a.b": 1}, + {"a.b": 1, _id: 0}, + {"a.b": 1, "a.c": 1}, + + {"a.b.c": 1}, + {"a.b.c": 1, _id: 0}, + {"a.b.c": 1, "a.b.d": 1}, + + // This syntax is permitted and equivalent to the dotted notation. + {a: {b: 1}}, + // A mix of dotted syntax and nested syntax is permitted as well. + {a: {"b.c": {d: 1, e: 1}}}, +]; +const indexes = [{"a": 1}, {"a": -1}, {"a.b": 1}, {"a.b": 1, "a.c": 1}, {"a.b.c": 1}]; +runProjectionsAgainstColl(coll, getProjectionDocs(), indexes, inclusionProjSpecs); + +// Show that inclusion of subpaths of _id is not special; it works the same way. +// Test without indexes this time. +const idInclusionProjSpecs = [ + {_id: 1}, + {"_id.a": 1}, + {"_id.a": 1, "_id.b": 1}, + {"_id.a.b": 1}, +]; +const idIndexes = [{"_id.a": 1}, {"_id.a": 1, "_id.b": 1}, {"_id.a.b": 1}]; +runProjectionsAgainstColl(coll, getIdProjectionDocs(), idIndexes, idInclusionProjSpecs); +}()); diff --git a/jstests/query_golden/libs/projection_helpers.js b/jstests/query_golden/libs/projection_helpers.js new file mode 100644 index 00000000000..9e94e5fb653 --- /dev/null +++ b/jstests/query_golden/libs/projection_helpers.js @@ -0,0 +1,151 @@ +load("jstests/query_golden/libs/utils.js"); + +/** + * Drops 'coll' and re-populates it according to 'docs' and 'indexes'. Then, runs the specified + * projections against the collection and prints the results. + */ +function runProjectionsAgainstColl(coll, docs, indexes, projSpecs) { + resetCollection(coll, docs, indexes); + + for (const projectionSpec of projSpecs) { + const pipeline = [{$project: projectionSpec}]; + jsTestLog(`Query: ${tojsononeline(pipeline)}`); + show(coll.aggregate(pipeline)); + + // TODO SERVER-71071: Consider adding a loop here which runs the aggregation and hints + // each of the provided indexes. + } +} + +/** + * Returns some example docs with interesting values as paths "a", "a.b", and "a.b.c". + */ +function getProjectionDocs() { + return [ + // + // Simple documents without any arrays along "a.b.c". + // + + // "a" is missing/null. + {}, + {a: null}, + {a: undefined}, + {x: "str", y: "str"}, + + // "a.b" is missing/null. + {a: "str", b: "str", x: "str", y: "str"}, + {a: {}}, + {a: {b: null, c: 1}}, + {a: {b: undefined, c: 1}}, + {a: {c: 1, d: 1}}, + {a: {d: 1}}, + {a: {c: {b: 1}}}, + + // "a.b.c" is missing/null + {a: {b: 1, c: 1, d: 1}, x: {y: 1, z: 1}}, + {a: {b: 1, _id: 1}}, + {a: {b: {}}}, + {a: {b: {c: null}}}, + {a: {b: {c: undefined}}}, + {a: {b: {x: 1, y: 1}}}, + + // All path components along "a.b.c" exist. + {a: {b: {c: "str", d: "str", e: "str"}, f: "str"}, x: "str"}, + + // Fields with similar names to the projected fields. + {"a.b.c": 1}, + {a: "str", abc: "str", "a.b": "str"}, + {a: {b: 1}, "a.b": "str"}, + {a: {bNot: {c: 1}}}, + + // + // Documents with arrays on the "a.b.c" path. + // + + // "a.b" is missing/null + {a: [], x: "str"}, + {a: ["str"]}, + {a: [null]}, + {a: [null, null]}, + {a: [null, "str"]}, + {a: [[], []]}, + {a: [[1, 2]]}, + {a: [{}, {}]}, + {a: [{x: "str"}]}, + {a: [{c: "str"}]}, + {a: [{b: null, c: 1}, {c: 1}, {d: 1}, "str"]}, + + // "a.b.c" is missing/null + {a: {b: [], x: "str"}}, + {a: {b: ["str"]}}, + {a: {b: [[]]}}, + {a: {b: [{}]}}, + {a: {b: [{c: null}]}}, + {a: [{b: {x: 1}}]}, + {a: [{b: [{}]}]}, + {a: [[], [[], [], [1], [{c: 1}]], {b: 1}]}, + + // Fields with similar names to the projected fields. + { + a: [ + // No "a.b". + {bNot: [{c: "str"}, {c: "str"}]}, + // No "a.b.c". + {b: [{cNot: "str", d: 1}, {cNot: "str", d: 2}]}, + // Only some "a.b.c"s. + {b: [{c: 3, d: 3}, {cNot: "str", d: 4}, {c: 5}]}, + ] + }, + + // + // All path components along "a.b.c" exist. + // + + // Exactly one array along the "a.b.c" path. + {a: [{b: {c: 2, d: 3}, e: 4}, {b: {c: 5, d: 6}, e: 7}]}, + {a: {b: [{c: 1, d: 1}, {c: 2, d: 2}]}}, + {a: {b: {c: [1, 2, {d: 3}]}}}, + {a: ["str", {b: 1}, {c: 1}, {b: 1, c: 1, d: 1}], x: "str"}, + + // Two arrays along the "a.b.c" path. + {a: [{b: [{c: 1, d: 1}, {c: 2, d: 2}]}, {b: [{c: 3, d: 3}, {c: 4, d: 4}]}]}, + {a: [{b: {c: [1, {d: 1}]}}, {b: {c: []}}]}, + {a: {b: [{c: [1, {d: 1}]}, {c: []}]}}, + + // "a", "a.b", and "a.b.c" are arrays. + { + a: [ + {b: [{c: [1, 2, 3], d: 1}, {c: [2, 3, 4], d: 2}]}, + {b: [{c: [3, 4, 5], d: 3}, {c: [4, 5, 6], d: 4}]} + ] + }, + + // Multiple nested arrays encountered between field path components. + {a: [[1, {b: 1}, {b: 2, c: 2}, "str"]]}, + {a: [[[{b: [[[{c: [[["str"]]], d: "str"}]]]}]]]}, + { + a: [ + ["str", {b: 1}, {b: 2, c: 2}, "str"], + [[{b: 1}]], + [{b: 1}, [{b: 2}], [[{b: [2]}]]], + ] + }, + + ]; +} + +/** + * Similar to getProjectionDocs(), but a smaller list where the interesting values are just under + * the _id field. + */ +function getIdProjectionDocs() { + return [ + {_id: 1, x: 2}, + {_id: {}, x: 1}, + {_id: {x: 1}, y: 2}, + {_id: {a: 1, c: 2}, x: 3}, + {_id: {a: 1, b: 2, c: 3}, x: 4}, + {_id: {a: {b: {c: 1}, d: 2}, e: 3}, x: 4}, + {_id: {a: [[{b: {c: 1}, d: 2}, 3], 4], e: 5}, x: 6}, + ]; +} diff --git a/jstests/query_golden/libs/utils.js b/jstests/query_golden/libs/utils.js new file mode 100644 index 00000000000..fdf690e4821 --- /dev/null +++ b/jstests/query_golden/libs/utils.js @@ -0,0 +1,24 @@ +load("jstests/query_golden/libs/example_data.js"); + +/** + * Drops 'coll' and repopulates it with 'docs' and 'indexes'. Sequential _ids are added to + * documents which do not have _id set. + */ +function resetCollection(coll, docs, indexes = []) { + coll.drop(); + + const docsWithIds = sequentialIds(docs); + jsTestLog("Resetting collection. Inserting docs:"); + show(docsWithIds); + + assert.commandWorked(coll.insert(docsWithIds)); + print(`Collection count: ${coll.find().itcount()}`); + + if (indexes.length > 0) { + jsTestLog("Creating indexes:"); + show(indexes); + for (let indexSpec of indexes) { + assert.commandWorked(coll.createIndex(indexSpec)); + } + } +} |