这比人们首先想象的要复杂一点。或许我只是在思考这个问题。
Character
.find({ random: { $near: [Math.random(), 0] } })
.where('voted', false)
.limit(2)
.exec(function(err, characters) {
res.send({ characters: characters });
}
});
我想补充的是 - 按性别查找。每个文档都有一个性别字段,其值设置为女性或男性。换句话说,我需要的是:给我两个具有匹配性别字段的随机文档。
示例 的: 2名随机雌性,2只随机雄性,2只随机雄性,2只随机雌性等...
有关如何从MongoDB检索随机文档的更多信息:http://cookbook.mongodb.org/patterns/random-attribute/
答案 0 :(得分:1)
如果您的收藏量足够大,我认为您只需在查询中添加随机gender
字段
var choices = {0: 'female', 1: 'male'}
.find({
gender: choices[Math.round(Math.random())],
random: { $near: [Math.random(), 0] }
})
但它无法解决您当前的结果并非真正随机的问题。如果你使用limit(1)
一切都像假设一样,但当限制设置为2时,事情就不那么简单了。假设你有这么简单的收藏:
> db.foo.find({}, {_id: 0}
{ "random" : [ 1, 0 ] }
{ "random" : [ 2, 0 ] }
{ "random" : [ 3, 0 ] }
{ "random" : [ 4, 0 ] }
{ "random" : [ 5, 0 ] }
并使用random: { $near: [Math.random() * 4 + 1, 0] } })
执行查询limit(2)
。每当最近的文档为{ "random" : [ 3, 0 ] }
时,您将获得{ "random" : [ 2, 0 ] }
或{ "random" : [ 4, 0 ] }
。
可能最好的解决方案是每次执行n个单独的查询并检索单个随机文档。