summaryrefslogtreecommitdiff
path: root/jstests/core/elemmatch_or_pushdown.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/elemmatch_or_pushdown.js')
-rw-r--r--jstests/core/elemmatch_or_pushdown.js138
1 files changed, 70 insertions, 68 deletions
diff --git a/jstests/core/elemmatch_or_pushdown.js b/jstests/core/elemmatch_or_pushdown.js
index b9a6d5bcc41..86888996b19 100644
--- a/jstests/core/elemmatch_or_pushdown.js
+++ b/jstests/core/elemmatch_or_pushdown.js
@@ -3,82 +3,84 @@
* SERVER-38164.
*/
(function() {
- "use strict";
+"use strict";
- const coll = db.elemmatch_or_pushdown;
- coll.drop();
+const coll = db.elemmatch_or_pushdown;
+coll.drop();
- assert.writeOK(coll.insert({_id: 0, a: 1, b: [{c: 4}]}));
- assert.writeOK(coll.insert({_id: 1, a: 2, b: [{c: 4}]}));
- assert.writeOK(coll.insert({_id: 2, a: 2, b: [{c: 5}]}));
- assert.writeOK(coll.insert({_id: 3, a: 1, b: [{c: 5}]}));
- assert.writeOK(coll.insert({_id: 4, a: 1, b: [{c: 6}]}));
- assert.writeOK(coll.insert({_id: 5, a: 1, b: [{c: 7}]}));
- assert.commandWorked(coll.createIndex({a: 1, "b.c": 1}));
+assert.writeOK(coll.insert({_id: 0, a: 1, b: [{c: 4}]}));
+assert.writeOK(coll.insert({_id: 1, a: 2, b: [{c: 4}]}));
+assert.writeOK(coll.insert({_id: 2, a: 2, b: [{c: 5}]}));
+assert.writeOK(coll.insert({_id: 3, a: 1, b: [{c: 5}]}));
+assert.writeOK(coll.insert({_id: 4, a: 1, b: [{c: 6}]}));
+assert.writeOK(coll.insert({_id: 5, a: 1, b: [{c: 7}]}));
+assert.commandWorked(coll.createIndex({a: 1, "b.c": 1}));
- assert.eq(coll.find({a: 1, b: {$elemMatch: {$or: [{c: 4}, {c: 5}]}}}).sort({_id: 1}).toArray(),
- [{_id: 0, a: 1, b: [{c: 4}]}, {_id: 3, a: 1, b: [{c: 5}]}]);
- assert.eq(coll.find({a: 1, $or: [{a: 2}, {b: {$elemMatch: {$or: [{c: 4}, {c: 5}]}}}]})
- .sort({_id: 1})
- .toArray(),
- [{_id: 0, a: 1, b: [{c: 4}]}, {_id: 3, a: 1, b: [{c: 5}]}]);
+assert.eq(coll.find({a: 1, b: {$elemMatch: {$or: [{c: 4}, {c: 5}]}}}).sort({_id: 1}).toArray(),
+ [{_id: 0, a: 1, b: [{c: 4}]}, {_id: 3, a: 1, b: [{c: 5}]}]);
+assert.eq(coll.find({a: 1, $or: [{a: 2}, {b: {$elemMatch: {$or: [{c: 4}, {c: 5}]}}}]})
+ .sort({_id: 1})
+ .toArray(),
+ [{_id: 0, a: 1, b: [{c: 4}]}, {_id: 3, a: 1, b: [{c: 5}]}]);
- coll.drop();
- assert.writeOK(coll.insert({_id: 0, a: 5, b: [{c: [{f: 8}], d: 6}]}));
- assert.writeOK(coll.insert({_id: 1, a: 4, b: [{c: [{f: 8}], d: 6}]}));
- assert.writeOK(coll.insert({_id: 2, a: 5, b: [{c: [{f: 8}], d: 7}]}));
- assert.writeOK(coll.insert({_id: 3, a: 4, b: [{c: [{f: 9}], d: 6}]}));
- assert.writeOK(coll.insert({_id: 4, a: 5, b: [{c: [{f: 8}], e: 7}]}));
- assert.writeOK(coll.insert({_id: 5, a: 4, b: [{c: [{f: 8}], e: 7}]}));
- assert.writeOK(coll.insert({_id: 6, a: 5, b: [{c: [{f: 8}], e: 8}]}));
- assert.writeOK(coll.insert({_id: 7, a: 5, b: [{c: [{f: 9}], e: 7}]}));
- assert.commandWorked(coll.createIndex({"b.d": 1, "b.c.f": 1}));
- assert.commandWorked(coll.createIndex({"b.e": 1, "b.c.f": 1}));
+coll.drop();
+assert.writeOK(coll.insert({_id: 0, a: 5, b: [{c: [{f: 8}], d: 6}]}));
+assert.writeOK(coll.insert({_id: 1, a: 4, b: [{c: [{f: 8}], d: 6}]}));
+assert.writeOK(coll.insert({_id: 2, a: 5, b: [{c: [{f: 8}], d: 7}]}));
+assert.writeOK(coll.insert({_id: 3, a: 4, b: [{c: [{f: 9}], d: 6}]}));
+assert.writeOK(coll.insert({_id: 4, a: 5, b: [{c: [{f: 8}], e: 7}]}));
+assert.writeOK(coll.insert({_id: 5, a: 4, b: [{c: [{f: 8}], e: 7}]}));
+assert.writeOK(coll.insert({_id: 6, a: 5, b: [{c: [{f: 8}], e: 8}]}));
+assert.writeOK(coll.insert({_id: 7, a: 5, b: [{c: [{f: 9}], e: 7}]}));
+assert.commandWorked(coll.createIndex({"b.d": 1, "b.c.f": 1}));
+assert.commandWorked(coll.createIndex({"b.e": 1, "b.c.f": 1}));
- assert.eq(coll.find({a: 5, b: {$elemMatch: {c: {$elemMatch: {f: 8}}, $or: [{d: 6}, {e: 7}]}}})
- .sort({_id: 1})
- .toArray(),
- [{_id: 0, a: 5, b: [{c: [{f: 8}], d: 6}]}, {_id: 4, a: 5, b: [{c: [{f: 8}], e: 7}]}]);
+assert.eq(coll.find({a: 5, b: {$elemMatch: {c: {$elemMatch: {f: 8}}, $or: [{d: 6}, {e: 7}]}}})
+ .sort({_id: 1})
+ .toArray(),
+ [{_id: 0, a: 5, b: [{c: [{f: 8}], d: 6}]}, {_id: 4, a: 5, b: [{c: [{f: 8}], e: 7}]}]);
- // Test that $not predicates in $elemMatch can be pushed into an $or sibling of the $elemMatch.
- coll.drop();
- assert.commandWorked(coll.insert({_id: 0, arr: [{a: 0, b: 2}], c: 4, d: 5}));
- assert.commandWorked(coll.insert({_id: 1, arr: [{a: 1, b: 2}], c: 4, d: 5}));
- assert.commandWorked(coll.insert({_id: 2, arr: [{a: 0, b: 3}], c: 4, d: 5}));
- assert.commandWorked(coll.insert({_id: 3, arr: [{a: 1, b: 3}], c: 4, d: 5}));
- assert.commandWorked(coll.insert({_id: 4, arr: [{a: 0, b: 2}], c: 6, d: 7}));
- assert.commandWorked(coll.insert({_id: 5, arr: [{a: 1, b: 2}], c: 6, d: 7}));
- assert.commandWorked(coll.insert({_id: 6, arr: [{a: 0, b: 3}], c: 6, d: 7}));
- assert.commandWorked(coll.insert({_id: 7, arr: [{a: 1, b: 3}], c: 6, d: 7}));
+// Test that $not predicates in $elemMatch can be pushed into an $or sibling of the $elemMatch.
+coll.drop();
+assert.commandWorked(coll.insert({_id: 0, arr: [{a: 0, b: 2}], c: 4, d: 5}));
+assert.commandWorked(coll.insert({_id: 1, arr: [{a: 1, b: 2}], c: 4, d: 5}));
+assert.commandWorked(coll.insert({_id: 2, arr: [{a: 0, b: 3}], c: 4, d: 5}));
+assert.commandWorked(coll.insert({_id: 3, arr: [{a: 1, b: 3}], c: 4, d: 5}));
+assert.commandWorked(coll.insert({_id: 4, arr: [{a: 0, b: 2}], c: 6, d: 7}));
+assert.commandWorked(coll.insert({_id: 5, arr: [{a: 1, b: 2}], c: 6, d: 7}));
+assert.commandWorked(coll.insert({_id: 6, arr: [{a: 0, b: 3}], c: 6, d: 7}));
+assert.commandWorked(coll.insert({_id: 7, arr: [{a: 1, b: 3}], c: 6, d: 7}));
- const keyPattern = {"arr.a": 1, "arr.b": 1, c: 1, d: 1};
- assert.commandWorked(coll.createIndex(keyPattern));
+const keyPattern = {
+ "arr.a": 1,
+ "arr.b": 1,
+ c: 1,
+ d: 1
+};
+assert.commandWorked(coll.createIndex(keyPattern));
- const elemMatchOr = {
- arr: {$elemMatch: {a: {$ne: 1}, $or: [{b: 2}, {b: 3}]}},
- $or: [
- {c: 4, d: 5},
- {c: 6, d: 7},
- ],
- };
+const elemMatchOr = {
+ arr: {$elemMatch: {a: {$ne: 1}, $or: [{b: 2}, {b: 3}]}},
+ $or: [
+ {c: 4, d: 5},
+ {c: 6, d: 7},
+ ],
+};
- // Confirm that we get the same results using the index and a COLLSCAN.
- for (let hint of[keyPattern, {$natural: 1}]) {
- assert.eq(coll.find(elemMatchOr, {_id: 1}).sort({_id: 1}).hint(hint).toArray(),
- [{_id: 0}, {_id: 2}, {_id: 4}, {_id: 6}]);
+// Confirm that we get the same results using the index and a COLLSCAN.
+for (let hint of [keyPattern, {$natural: 1}]) {
+ assert.eq(coll.find(elemMatchOr, {_id: 1}).sort({_id: 1}).hint(hint).toArray(),
+ [{_id: 0}, {_id: 2}, {_id: 4}, {_id: 6}]);
- assert.eq(
- coll.aggregate(
- [
- {
- $match:
- {arr: {$elemMatch: {a: {$ne: 1}}}, $or: [{c: 4, d: 5}, {c: 6, d: 7}]}
- },
- {$project: {_id: 1}},
- {$sort: {_id: 1}}
- ],
- {hint: hint})
- .toArray(),
- [{_id: 0}, {_id: 2}, {_id: 4}, {_id: 6}]);
- }
+ assert.eq(
+ coll.aggregate(
+ [
+ {$match: {arr: {$elemMatch: {a: {$ne: 1}}}, $or: [{c: 4, d: 5}, {c: 6, d: 7}]}},
+ {$project: {_id: 1}},
+ {$sort: {_id: 1}}
+ ],
+ {hint: hint})
+ .toArray(),
+ [{_id: 0}, {_id: 2}, {_id: 4}, {_id: 6}]);
+}
}());