summaryrefslogtreecommitdiff
path: root/jstests/core/query/array/arrayfind7.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/query/array/arrayfind7.js')
-rw-r--r--jstests/core/query/array/arrayfind7.js51
1 files changed, 51 insertions, 0 deletions
diff --git a/jstests/core/query/array/arrayfind7.js b/jstests/core/query/array/arrayfind7.js
new file mode 100644
index 00000000000..be2061c5c0d
--- /dev/null
+++ b/jstests/core/query/array/arrayfind7.js
@@ -0,0 +1,51 @@
+// Nested $elemMatch clauses. SERVER-5741
+
+t = db.jstests_arrayfind7;
+t.drop();
+
+t.save({a: [{b: [{c: 1, d: 2}]}]});
+
+function checkElemMatchMatches() {
+ assert.eq(1, t.count({a: {$elemMatch: {b: {$elemMatch: {c: 1, d: 2}}}}}));
+}
+
+// The document is matched using nested $elemMatch expressions, with and without an index.
+checkElemMatchMatches();
+t.createIndex({'a.b.c': 1});
+checkElemMatchMatches();
+
+function checkElemMatch(index, document, query) {
+ // The document is matched without an index, and with single and multi key indexes.
+ t.drop();
+ t.save(document);
+ assert.eq(1, t.count(query));
+ t.createIndex(index);
+ assert.eq(1, t.count(query));
+ t.save({a: {b: {c: [10, 11]}}}); // Make the index multikey.
+ assert.eq(1, t.count(query));
+}
+
+// Two constraints within a nested $elemMatch expression.
+checkElemMatch({'a.b.c': 1},
+ {a: [{b: [{c: 1}]}]},
+ {a: {$elemMatch: {b: {$elemMatch: {c: {$gte: 1, $lte: 1}}}}}});
+
+// Two constraints within a nested $elemMatch expression, one of which contains the other.
+checkElemMatch({'a.b.c': 1},
+ {a: [{b: [{c: 2}]}]},
+ {a: {$elemMatch: {b: {$elemMatch: {c: {$gte: 1, $in: [2]}}}}}});
+
+// Two nested $elemMatch expressions.
+checkElemMatch({'a.d.e': 1, 'a.b.c': 1}, {a: [{b: [{c: 1}], d: [{e: 1}]}]}, {
+ a: {$elemMatch: {d: {$elemMatch: {e: {$lte: 1}}}, b: {$elemMatch: {c: {$gte: 1}}}}}
+});
+
+// A non $elemMatch expression and a nested $elemMatch expression.
+checkElemMatch({'a.x': 1, 'a.b.c': 1},
+ {a: [{b: [{c: 1}], x: 1}]},
+ {'a.x': 1, a: {$elemMatch: {b: {$elemMatch: {c: {$gte: 1}}}}}});
+
+// $elemMatch is applied directly to a top level field.
+checkElemMatch({'a.b.c': 1},
+ {a: [{b: [{c: [1]}]}]},
+ {a: {$elemMatch: {'b.c': {$elemMatch: {$gte: 1, $lte: 1}}}}});