summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jstests/index13.js40
1 files changed, 40 insertions, 0 deletions
diff --git a/jstests/index13.js b/jstests/index13.js
index 3069ff15038..4ec79795fb9 100644
--- a/jstests/index13.js
+++ b/jstests/index13.js
@@ -70,6 +70,46 @@ assertResultsAndIndexBounds( { 'a.b':[[ 1, 1 ]], 'a.c':[[ 1, 1 ]] },
assertResultsAndIndexBounds( { 'a.b':[[ 1, 1 ]], 'a.c':[[ 1, 1 ]] },
{ a:{ $elemMatch:{ b:1, c:1 } }, 'a.b':{ $gt:0 } } );
+// Cases with $elemMatch on multiple fields.
+t.remove();
+index = { 'a.b':1, 'a.c':1, 'd.e':1, 'd.f':1 };
+t.ensureIndex( index );
+t.insert( { a:[ { b:1 }, { c:1 } ], d: { e:1, f:1 } } );
+t.insert( { a:[ { b:1, c:1 } ], d: { e:1, f:1 } } );
+t.insert( { a:{ b:1, c:1 }, d:[ { e:1, f:1 } ] } );
+t.insert( { a:{ b:1, c:1 }, d:[ { e:1 }, { f:1 } ] } );
+
+assert.eq( 4, t.count() );
+
+// Without $elemMatch.
+assertResultsAndIndexBounds( { 'a.b':[[ 1, 1 ]], 'a.c':[[ MIN, MAX ]], 'd.e':[[ 1, 1 ]], 'd.f':[[ MIN, MAX ]] },
+ { 'a.b':1, 'a.c':1, 'd.e':1, 'd.f':1 } );
+// With $elemMatch on two fields
+assertResultsAndIndexBounds( { 'a.b':[[ 1, 1 ]], 'a.c':[[ 1, 1 ]], 'd.e':[[ 1, 1 ]], 'd.f':[[ 1, 1 ]] },
+ { a:{ $elemMatch:{ b:1, c:1 } }, 'd': { $elemMatch:{ e:1, f:1 } } } );
+
+// With $elemMatch on first field but not the second
+assertResultsAndIndexBounds( { 'a.b':[[ 1, 1 ]], 'a.c':[[ 1, 1 ]], 'd.e':[[ 1, 1 ]], 'd.f':[[ MIN, MAX ]] },
+ { a:{ $elemMatch:{ b:1, c:1 } }, 'd.e': 1, 'd.f' : 1 } );
+
+// With $elemMatch on second field but not the first
+assertResultsAndIndexBounds( { 'a.b':[[ 1, 1 ]], 'a.c':[[ MIN, MAX ]], 'd.e':[[ 1, 1 ]], 'd.f':[[ 1, 1 ]] },
+ { 'a.b': 1, 'a.c' : 1, 'd': { $elemMatch:{ e:1, f:1 } } } );
+
+
+// Cases with nested $elemMatch.
+t.remove()
+index = { 'a.b.c':1, 'a.b.d' :1 };
+t.ensureIndex( index );
+t.insert( { a:[ { b: [ { c : 1, d : 1 } ] } ] } ) ;
+t.insert( { a:[ { b: [ { c : 1 } , { d : 1 } ] } ] } ) ;
+assert.eq( 2, t.count() );
+// Without $elemMatch.
+assertResultsAndIndexBounds( { 'a.b.c':[[ 1, 1 ]], 'a.b.d':[[ MIN, MAX ]] },
+ { 'a.b.c':1, 'a.b.d':1 } );
+// With $elemMatch.
+assertResultsAndIndexBounds( { 'a.b.c':[[ 1, 1 ]], 'a.b.d':[[ 1, 1 ]] },
+ { "a" : { $elemMatch : { "b" : { $elemMatch : { c : 1, d : 1 } } } } } );
// Cases with double dotted index field names.
t.drop();