cursor.skip() (original) (raw)

cursor.skip(<offset>)

Important

mongosh Method

This page documents a mongosh method. This is _not_the documentation for a language-specific driver, such as Node.js.

For MongoDB API drivers, refer to the language-specificMongoDB driver documentation.

Call the skip() method on a cursor to control where MongoDB begins returning results. This approach may be useful in implementing paginated results.

Note

You must apply skip() to the cursor before retrieving any documents from the database.

The skip() method has the following parameter:

Parameter Type Description
offset number The number of documents to skip in the results set.

This method is available in deployments hosted in the following environments:

Note

This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, seeUnsupported Commands.

If using skip() with sort(), be sure to include at least one field in your sort that contains unique values, before passing results to skip().

Sorting on fields that contain duplicate values may return an inconsistent sort order for those duplicate fields over multiple executions, especially when the collection is actively receiving writes.

The easiest way to guarantee sort consistency is to include the_id field in your sort query.

See Consistent sorting with the sort() method for more information.

When you chain skip() and limit(), the method chaining order does not affect the results. The server always applies the skip operation based on the sort order before it applies the limit on how many documents to return.

The following code example shows different chaining orders forskip() and limit() that always produce the same query results for the same data set:


db.myColl.find().sort({_id: 1}).skip(3).limit(6);

db.myColl.find().sort({_id: 1}).limit(6).skip(3);

The following JavaScript function uses skip() to paginate a collection by its _id field:


function printStudents(pageNumber, nPerPage) {

  print( "Page: " + pageNumber );

  db.students.find()

             .sort( { _id: 1 } )

             .skip( pageNumber > 0 ? ( ( pageNumber - 1 ) * nPerPage ) : 0 )

             .limit( nPerPage )

             .forEach( student => {

               print( student.name );

             } );

}

The skip() method requires the server to scan from the beginning of the input results set before beginning to return results. As the offset increases, skip() will become slower.

Range queries can use indexes to avoid scanning unwanted documents, typically yielding better performance as the offset grows compared to using skip() for pagination.

Use this procedure to implement pagination with range queries:

For example, the following function uses the above procedure to print pages of student names from a collection, sorted approximately in order of newest documents first using the _id field (that is, in_descending_ order):


function printStudents(startValue, nPerPage) {

  let endValue = null;

  db.students.find( { _id: { $lt: startValue } } )

             .sort( { _id: -1 } )

             .limit( nPerPage )

             .forEach( student => {

               print( student.name );

               endValue = student._id;

             } );

  return endValue;

}

You may then use the following code to print all student names using this pagination function, using MaxKey to start from the largest possible key:


let currentKey = MaxKey;

while (currentKey !== null) {

  currentKey = printStudents(currentKey, 10);

}

Note

While ObjectId values should increase over time, they are not necessarily monotonic. This is because they:

Returning paginated results in ascending order is similar to the previous, but uses $gt with an ascending sort order:


function printStudents(startValue, nPerPage) {

  let endValue = null;

  db.students.find( { _id: { $gt: startValue } } )

             .sort( { _id: 1 } )

             .limit( nPerPage )

             .forEach( student => {

               print( student.name );

               endValue = student._id;

             } );

  return endValue;

}

Using this function is likewise similar, but withMinKey as the starting key:


let currentKey = MinKey;

while (currentKey !== null) {

  currentKey = printStudents(currentKey, 10);

}