MongoDB:查询单个随机文档的最有效方法是什么?

7
我需要从集合中随机选择一个文档(或者从随机位置的“窗口”中选择一小组连续文档)。
我找到了两个解决方案:12。第一个解决方案对于大型集合来说是不可接受的,因为我希望尽量减少文档大小。第二个解决方案似乎不太有效(我不确定skip操作的复杂度)。在这里,可以找到查询具有指定索引的文档的提及,但我不知道如何实现它(我正在使用C++驱动程序)。
是否有其他解决方案?哪一个最高效?

在MongoDB的票务跟踪器中,有一个获取集合中随机项目的功能请求。如果实现了本地化处理,它很可能是最有效的选择。 (如果您想要此功能,请投票支持它。) - David J.
1
这个问题在 Stack Overflow 上以多种形式被问到。最受欢迎的问题是 从 MongoDB 中获取随机记录 -- 它有很好的回答。话虽如此,我认为考虑这个问题的最佳方式不是考虑获取一个随机文档,而是随机化结果集。请参见 在 Mongo 中随机排序结果集 - David J.
2个回答

1

看起来你可以通过塑造解决方案1来实现此目的(假设你的_id键是自动递增值),然后对记录进行计数,并将其用作c++中随机整数的上限,然后抓取该行。

同样,如果你没有自动递增的_id键,只需在结果中创建一个即可。额外添加一个带有INT的字段不会太大程度地增加文档大小。

如果你没有自动递增字段,Mongo讲解如何快速添加一个:

自动递增字段。


我不确定是否有自增的 _id。我希望避免使用它。我的文档有 ID 字段,每次插入新文档时我都会对该字段进行 ensureIndex 操作。我是 Mongo 的新手,所以无法确定。 - Violet Giraffe
有没有可能查询一个文档,而不是匹配索引,而是最接近我指定的索引?它应该像通常按索引查询一样快,并且解决了我的问题。 - Violet Giraffe
Mongo的ID有一个问题,如果你使用默认的MongoID(它生成的),它们将使用BSON的对象模型:http://www.mongodb.org/display/DOCS/Object+IDs。但是你可以通过在初始文档创建时创建自己的一组_id来覆盖它,只需要确认它们始终是唯一的即可。 - Petrogad
1
更新了关于MongoDB中自增字段的问题,讲述了如何添加。希望这能有所帮助! - Petrogad

1

我曾经遇到过类似的问题。在我的情况下,我的文档上有一个日期属性。我知道数据集中最早的日期,因此在我的应用程序代码中,我会生成一个在EARLIEST_DATE_IN_SET和NOW范围内的随机日期,然后使用日期属性上的GTE查询查询mongodb,并将其限制为1个结果。

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

在日期属性上建立索引后,这是一个超级快速的查询。


谢谢,我选择了这个选项。我刚刚对我的应用程序进行了分析,希望所有的Mongo访问都像使用你的方法随机选择文档一样快速 :) - Violet Giraffe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接