【发布时间】:2012-02-08 15:10:24
【问题描述】:
我不能使用Array#shuffle,因为我没有获取所有文档(我最多只能获取二十个文档)。如何使用 MongoMapper 从 MongoDB 数据库中获取随机文档(即在 MySQL 中使用 ORDER BY RAND())?
【问题讨论】:
标签: ruby mongodb random mongomapper
我不能使用Array#shuffle,因为我没有获取所有文档(我最多只能获取二十个文档)。如何使用 MongoMapper 从 MongoDB 数据库中获取随机文档(即在 MySQL 中使用 ORDER BY RAND())?
【问题讨论】:
标签: ruby mongodb random mongomapper
没有类似于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.
【讨论】:
使用跳过和随机类。
class Book {
include MongoMapper::Document
key :title
key :author
}
rand = Random.rand(0..(Book.count-1))
Book.skip(rand).first
【讨论】: