summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jstests/count2.js23
-rw-r--r--shell/query.js12
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
*/