summaryrefslogtreecommitdiff
path: root/jstests
diff options
context:
space:
mode:
authorHana Pearlman <hana.pearlman@mongodb.com>2022-11-08 13:40:35 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-11-08 14:57:34 +0000
commit6f0704c3988ddfc0acff2e3438413b46cf4840e8 (patch)
tree55a73b4aaef7dad94f6948279dbde437e6346a62 /jstests
parentac0a38a08ac02d83632b1d82b7c3c5b6e5276b41 (diff)
downloadmongo-6f0704c3988ddfc0acff2e3438413b46cf4840e8.tar.gz
SERVER-62329: Port simple projections tests to golden framework
Diffstat (limited to 'jstests')
-rw-r--r--jstests/noPassthrough/cqf_fallback.js4
-rw-r--r--jstests/query_golden/exclusion_projection.js37
-rw-r--r--jstests/query_golden/expected_output/exclusion_projection655
-rw-r--r--jstests/query_golden/expected_output/inclusion_projection852
-rw-r--r--jstests/query_golden/inclusion_projection.js45
-rw-r--r--jstests/query_golden/libs/projection_helpers.js151
-rw-r--r--jstests/query_golden/libs/utils.js24
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));
+ }
+ }
+}