diff options
author | Aaron Staple <aaron@10gen.com> | 2009-06-05 12:13:49 -0400 |
---|---|---|
committer | Aaron Staple <aaron@10gen.com> | 2009-06-05 12:13:49 -0400 |
commit | 1fd840fd64b9147631262bd7ad09ede9b6f9fcbb (patch) | |
tree | ed29129e8664c0eac1b5c0a96296a7cd79b227a2 | |
parent | 5514c49e39849671826d863ed23d49ef58968a8f (diff) | |
download | mongo-1fd840fd64b9147631262bd7ad09ede9b6f9fcbb.tar.gz |
BUG SERVER-92 $all scan only one key in index
-rw-r--r-- | db/queryutil.cpp | 15 | ||||
-rw-r--r-- | jstests/index_check2.js | 6 |
2 files changed, 16 insertions, 5 deletions
diff --git a/db/queryutil.cpp b/db/queryutil.cpp index 44deaf59a05..d4b6219a965 100644 --- a/db/queryutil.cpp +++ b/db/queryutil.cpp @@ -55,9 +55,18 @@ namespace mongo { case BSONObj::GTE: lower_ = e; break; - case BSONObj::opIN: - case BSONObj::opALL: { - massert( "$in/$all require array", e.type() == Array ); + case BSONObj::opALL: { + massert( "$all requires array", e.type() == Array ); + BSONObjIterator i( e.embeddedObject() ); + if ( i.more() ) { + BSONElement f = i.next(); + if ( !f.eoo() ) + lower_ = upper_ = f; + } + break; + } + case BSONObj::opIN: { + massert( "$in requires array", e.type() == Array ); BSONElement max = minKey.firstElement(); BSONElement min = maxKey.firstElement(); BSONObjIterator i( e.embeddedObject() ); diff --git a/jstests/index_check2.js b/jstests/index_check2.js index 8543849be39..5ffd93bf65b 100644 --- a/jstests/index_check2.js +++ b/jstests/index_check2.js @@ -32,8 +32,10 @@ scanned1 = t.find(q1).explain().nscanned; scanned2 = t.find(q2).explain().nscanned; scanned3 = t.find(q3).explain().nscanned; -print( "scanned1: " + scanned1 + " scanned2: " + scanned2 + " scanned3: " + scanned3 ); +//print( "scanned1: " + scanned1 + " scanned2: " + scanned2 + " scanned3: " + scanned3 ); // $all should just iterate either of the words -//assert( scanned3 <= Math.max( scanned1 , scanned2 ) , "$all makes query optimizer not work well" ); +assert( scanned3 <= Math.max( scanned1 , scanned2 ) , "$all makes query optimizer not work well" ); +exp3 = t.find( q3 ).explain(); +assert.eq( exp3.startKey, exp3.endKey, "$all range not a single key" ); |