Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finding the next document in MongoDb

Tags:

mongodb

If this is my collection structure:

{ _id: ObjectId("4fdbaf608b446b0477000142"), name: "product 1" }
{ _id: ObjectId("4fdbaf608b446b0477000143"), name: "product 2" }
{ _id: ObjectId("4fdbaf608b446b0477000144"), name: "product 3" }

and I query product 1, is there a way to query the next document, which in this case would be "product 2"?

like image 235
Claremont Avatar asked Aug 17 '12 19:08

Claremont


1 Answers

It is best to add explicit sort() criteria if you want a predictable order of results.

Assuming the order you are after is "insertion order" and you are using MongoDB's default generated ObjectIds, then you can query based on the ObjectId:

// Find next product created
db.products.find({_id: {$gt: ObjectId("4fdbaf608b446b0477000142") }}).limit(1)

Note that this example only works because:

  • the first four bytes of the ObjectId are calculated from a unix-style timestamp (see: ObjectId Specification)
  • a query on _id alone will use the default _id index (sorted by id) to find a match

So really, this implicit sort is the same as:

db.products.find({_id: {$gt: ObjectId("4fdbaf608b446b0477000142" )}}).sort({_id:1}).limit(1);

If you added more criteria to the query to qualify how to find the "next" product (for example, a category), the query could use a different index and the order may not be as you expect.

You can check index usage with explain().

like image 103
Stennie Avatar answered Oct 05 '22 23:10

Stennie