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

Posted

技术标签:

【中文标题】MongoDB:查找具有匹配字段的文档?【英文标题】:MongoDB: Find documents that have a matching field? 【发布时间】:2013-11-01 05:56:46 【问题描述】:

这比人们最初想象的要复杂一些。或者我只是想太多了。

这是我从 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/

【问题讨论】:

【参考方案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 ] 

并使用limit(2) 执行查询random: $near: [Math.random() * 4 + 1, 0] )。每次最近的文档是 "random" : [ 3, 0 ] 时,您将获得 "random" : [ 2, 0 ] "random" : [ 4, 0 ]

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

【讨论】:

感谢您的建议。我注意到了这个问题,但希望我不必进行 2 次查询。至于性别,重点是不指定性别。如果一个文件是女性,那么其他文件也必须是女性。接下来的两个文件可能是男性或女性。 如果你不介意我认为随机选择性别应该绰绰有余。我已经更新了答案。

以上是关于MongoDB:查找具有匹配字段的文档?的主要内容,如果未能解决你的问题,请参考以下文章

Mongo 查询以查找任何字段元素与任何查询参数元素匹配的文档

如何在其中一个字段 Mongo Db [重复] 中检索具有最大值的文档

MongoDB:通过不存在的字段查找文档?

在Java中查询具有完全匹配字段MongoDB的数组元素

MongoDb:查找具有重复项的精确数组匹配

使用 Mongoose 查找子文档字段部分匹配给定条件的文档