user142019
user142019

Reputation:

How can I fetch documents in a random order using MongoMapper?

I cannot use Array#shuffle since I don't fetch all documents (I only fetch up to twenty documents). How can I fetch random documents from a MongoDB database using MongoMapper (i.e. in MySQL one would use ORDER BY RAND())?

Upvotes: 1

Views: 386

Answers (2)

MyounghoonKim
MyounghoonKim

Reputation: 1090

Use skip and Random class.

class Book {
  include MongoMapper::Document

  key :title
  key :author
}

rand = Random.rand(0..(Book.count-1))
Book.skip(rand).first

Upvotes: 0

Sergio Tulentsev
Sergio Tulentsev

Reputation: 230386

There's no technique similar to ORDER BY RAND(). And even in MySQL it is advised to avoid it (on large tables).

You could apply some common tricks, however.

For example, if you know min and max value for your id, then pick a random value within the range and get the next object.

db.collection.find({_id: {$gte: random_id}}).limit(1);

Repeat 20 times.

Or you could add "random" field to each document yourself (and recalc it every once in a while). This way you won't get really random results with each query, but it'll be pretty cheap.

db.collection.find().sort({pseudo_random_field: 1}).limit(20)

// you can also skip some records here, but don't skip a lot.

Upvotes: 3

Related Questions