2011-11-09 35 views
7

我需要随机从一个集合中挑选一个文档(或者从随机定位的“窗口”中选择少量连续的文档)。 我发现了两种解决方案:12。第一个是不可接受的,因为我预计收集量很大,希望尽量减少文档大小。第二个似乎无效(我不确定skip操作的复杂性)。和here人们可以找到一个指定的索引查询文件,但我不知道该怎么做(我使用的是C++驱动程序)。MongoDB:查询单个随机文档的最有效方法是什么?

是否有其他解决方案?哪种效率最高?

+0

在MongoDB票据跟踪器中有[从集合中获取随机项的功能请求](https://jira.mongodb.org/browse/SERVER-533)。如果本地实施,它可能是最有效的选择。 (如果你想要的功能,请投票。) –

+1

这个问题在Stack Overflow这里有很多问题。最流行的问题是[来自MongoDB的随机记录](http://stackoverflow.com/questions/2824157/random-record-from-mongodb) - 它有很好的回应。也就是说,我认为考虑这个问题的最佳方式不是考虑获取一个随机文档,而是随机化一个结果集。请参阅[在Mongo中随机排列结果集](http://stackoverflow.com/questions/8500266/ordering-a-result-set-randomly-in-mongo)。 –

回答

2

我有一个类似的问题一次。就我而言,我在文档上有一个日期属性。我知道数据集中最早的日期,所以在我的应用程序代码中,我将在EARLIEST_DATE_IN_SET和NOW范围内生成一个随机日期,然后使用date属性上的GTE查询来查询mongodb,并将其限制为1个结果。

随机日期大于数据集中的最高日期的可能性很小,所以我在应用程序代码中考虑了这一点。

使用date属性的索引,这是一个超快速查询。

+0

谢谢,我选择了这个选项。我刚刚介绍了我的应用程序,并希望所有的Mongo访问都像使用您的方法一样随机选择一个文档:) –

2

看起来你可以在那里模拟解决方案1(假设你的_id键是一个auto-inc值),那么就对你的记录进行一次计数,然后用它作为C++中随机int的上限,然后抓住那一行。

同样,如果您没有autoinc _id键,只需使用结果创建一个。使用INT添加一个字段不应该增加您的文档大小。

如果您没有自动INC场蒙戈谈到如何快速添加一个这里:

Auto Inc Field.

+0

我不确定我是否拥有autoinc _id或没有。我希望避免它。我的文档有ID字段,每当我插入新的文档时,我都会为该字段执行'ensureIndex'。我是Mongo的新手,所以我无法确定。 –

+0

是否可以查询与匹配索引不匹配的文档,但与指定的索引最接近?它应该像索引通常的查询一样快,并且它解决了我的问题。 –

+0

Mongo ID的东西是,如果你使用默认的MongoID(它生成),他们使用BSON的对象模型:http://www.mongodb.org/display/DOCS/Object+IDs。您可以通过在初始文档创建时创建自己的一组_id来覆盖它,只需确认它们始终是唯一的。 – Petrogad

相关问题