MongoDB - Pagination based on non-unique fields

@cubbuk shows a good example using offset (skip) but you can also mould the query he shows for ranged pagination as well:

db.collection.find().sort({numTimesDoneSomething:-1, _id:1})

Since the _id here will be unique and you are seconding on it you can actually then range by _id and the results, even between two records having numTimesDoneSomething of 12, should be consistent as to whether they should be on one page or the next.

So doing something as simple as

var q = db.collection.find({_id: {$gt: last_id}}).sort({numTimesDoneSomething:-1, _id:1}).limit(2)

Should work quite good for ranged pagination.


You can sort on multiple fields in this case sort on numTimesDoneSomething and id field. Since id_ field is ascending in itself already according to the insertion timestamp, you will able to paginate through the collection without iterating over duplicate data unless new data is inserted during the iteration.

db.collection.find().sort({numTimesDoneSomething:-1, _id:1}).offset(index).limit(2)

Tags:

Mongodb