summaryrefslogtreecommitdiff
path: root/jstests/core/query/array/arrayfindb.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/query/array/arrayfindb.js')
-rw-r--r--jstests/core/query/array/arrayfindb.js30
1 files changed, 30 insertions, 0 deletions
diff --git a/jstests/core/query/array/arrayfindb.js b/jstests/core/query/array/arrayfindb.js
new file mode 100644
index 00000000000..51fa22f6dff
--- /dev/null
+++ b/jstests/core/query/array/arrayfindb.js
@@ -0,0 +1,30 @@
+// Test $elemMatch object with complex embedded expressions.
+
+var t = db.jstests_arrayfindb;
+t.drop();
+
+// Case #1: Ensure correct matching for $elemMatch with an embedded $and (SERVER-13664).
+t.save({a: [{b: 1, c: 25}, {a: 3, b: 59}]});
+assert.eq(0,
+ t.find({a: {$elemMatch: {b: {$gte: 2, $lt: 4}, c: 25}}}).itcount(),
+ "Case #1: wrong number of results returned -- unindexed");
+
+t.createIndex({"a.b": 1, "a.c": 1});
+assert.eq(0,
+ t.find({a: {$elemMatch: {b: {$gte: 2, $lt: 4}, c: 25}}}).itcount(),
+ "Case #1: wrong number of results returned -- indexed");
+
+// Case #2: Ensure correct matching for $elemMatch with an embedded $or.
+t.drop();
+t.save({a: [{b: 1}, {c: 1}]});
+t.save({a: [{b: 2}, {c: 1}]});
+t.save({a: [{b: 1}, {c: 2}]});
+assert.eq(2,
+ t.find({a: {$elemMatch: {$or: [{b: 2}, {c: 2}]}}}).itcount(),
+ "Case #2: wrong number of results returned -- unindexed");
+
+t.createIndex({"a.b": 1});
+t.createIndex({"a.c": 1});
+assert.eq(2,
+ t.find({a: {$elemMatch: {$or: [{b: 2}, {c: 2}]}}}).itcount(),
+ "Case #2: wrong number of results returned -- indexed");