2012-02-08 4 views
1

Array#shuffleを使用することはできません。すべてのドキュメントを取得しないためです(ドキュメントは最大20個しか取得できません)。 MongoMapperを使用してMongoDBデータベースからランダムなドキュメントを取得するにはどうすればよいですか(つまり、MySQLではORDER BY RAND()を使用します)。MongoMapperを使用してドキュメントをランダムな順序で取得するにはどうすればよいですか?

答えて

3

ORDER BY RAND()に似た技術はありません。そして、MySQLでさえそれを避けることが勧められます(大きなテーブルで)。

しかし、いくつかの一般的なトリックを適用することができます。

たとえば、IDの最小値と最大値が分かっている場合は、範囲内のランダム値を選択して次のオブジェクトを取得します。

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

20回繰り返す。

また、各文書に「ランダム」フィールドを追加することもできます(そして、しばらく毎回それを再計算することもできます)。この方法では、各クエリで実際にランダムな結果を得ることはありませんが、かなり安いでしょう。

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

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

スキップとランダムクラスを使用してください。

class Book { 
    include MongoMapper::Document 

    key :title 
    key :author 
} 

rand = Random.rand(0..(Book.count-1)) 
Book.skip(rand).first 
関連する問題