1

这比人们最初想象的要复杂一些。或者,也许我只是想多了这个问题。

这是我从 MongoDB 检索(两个)随机文档的方法:

Character
  .find({ random: { $near: [Math.random(), 0] } })
  .where('voted', false)
  .limit(2)
  .exec(function(err, characters) {
    res.send({ characters: characters });
  }
});

我想补充的是 -按性别查找。每个文档已经有一个性别字段,其值设置为femalemale。换句话说,我需要的是:给我两个具有匹配性别字段的随机文档。

示例:2个随机女性,2个随机男性,2个随机男性,2个随机女性,等等......

有关如何从 MongoDB 检索随机文档的更多信息:http: //cookbook.mongodb.org/patterns/random-attribute/

4

1 回答 1

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 ] }or { "random" : [ 4, 0 ] }

最好的解决方案可能是每次执行 n 个单独的查询并检索单个随机文档。

于 2013-11-01T07:27:18.807 回答