diff options
-rw-r--r-- | jstests/count2.js | 23 | ||||
-rw-r--r-- | shell/query.js | 12 |
2 files changed, 35 insertions, 0 deletions
diff --git a/jstests/count2.js b/jstests/count2.js new file mode 100644 index 00000000000..33ff7121bf4 --- /dev/null +++ b/jstests/count2.js @@ -0,0 +1,23 @@ +t = db.count2; +t.drop(); + +for ( var i=0; i<1000; i++ ){ + t.save( { num : i , m : i % 20 } ); +} + +assert.eq( 1000 , t.count() , "A" ) +assert.eq( 1000 , t.find().count() , "B" ) +assert.eq( 1000 , t.find().toArray().length , "C" ) + +assert.eq( 50 , t.find( { m : 5 } ).toArray().length , "D" ) +assert.eq( 50 , t.find( { m : 5 } ).count() , "E" ) + +assert.eq( 40 , t.find( { m : 5 } ).skip( 10 ).toArray().length , "F" ) +assert.eq( 50 , t.find( { m : 5 } ).skip( 10 ).count() , "G" ) +assert.eq( 40 , t.find( { m : 5 } ).skip( 10 ).countReturn() , "H" ) + +assert.eq( 20 , t.find( { m : 5 } ).skip( 10 ).limit(20).toArray().length , "I" ) +assert.eq( 50 , t.find( { m : 5 } ).skip( 10 ).limit(20).count() , "J" ) +assert.eq( 20 , t.find( { m : 5 } ).skip( 10 ).limit(20).countReturn() , "K" ) + +assert.eq( 5 , t.find( { m : 5 } ).skip( 45 ).limit(20).countReturn() , "L" ) diff --git a/shell/query.js b/shell/query.js index e152c669913..2c108af42ee 100644 --- a/shell/query.js +++ b/shell/query.js @@ -116,6 +116,18 @@ DBQuery.prototype.count = function(){ throw "count failed: " + tojson( res ); } +DBQuery.prototype.countReturn = function(){ + var c = this.count(); + + if ( this._skip ) + c = c - this._skip; + + if ( this._limit > 0 && this._limit < c ) + return this._limit; + + return c; +} + /** * iterative count - only for testing */ |