MongoDB:查找具有匹配字段的文档?

时间:2013-11-01 05:56:47

标签: mongodb mongoose

这比人们首先想象的要复杂一点。或许我只是在思考这个问题。

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

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/

1 个答案:

答案 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个单独的查询并检索单个随机文档。