我有一个大约有500000个数据集的集合,我喜欢从中找到一个随机数据集。 我可以将find()限制为customer-id,从而将大小减小到大约80000集。指数也会添加到客户ID中。
在PHP中,我使用以下命令获取随机数据集:
$mongoCursor = $mongoCollection->find($arrQuery, $arrFields)->skip(rand(1, $dataCount));
剖析器现在告诉:
DB.Collection ntoskip:3224 nscanned:3326 nreturned:101 reslen:77979 262ms
这需要相当长的时间来获取结果。 有没有更好的方法来获取数据?
我考虑过在PHP中获取所有ID,然后随机获取一个id并找到此id的完整集合。但我担心在php中获取如此多的数据。
感谢您对该主题的任何想法。 丹
答案 0 :(得分:2)
跳过强制Mongo遍历结果集,直到它到达您正在查找的文档,因此该查询的结果集越大,它将花费的时间越长。
这个用例真正需要的是一种随机识别文档的方法,而不是随机查询文档。您可以为每个文档提供增量标识符,然后只需在已知的ID范围内随机选择一个数字,直到找到存在的数字,但如果删除了大量文档或需要应用过滤可能匹配的查询,则该范围人口稀少,最终可能需要更长时间才能找到结果。这取决于您的数据和使用情况。
如果此方法不适用于您的数据和用法,您还可以尝试此处讨论的方法:http://cookbook.mongodb.org/patterns/random-attribute/
最重要的是mongo不会为你做这件事,所以你真的要找出如何随机识别数据中的文件。
答案 1 :(得分:0)
您好我尝试了多种解决方案来解决随机问题。 我使用光标并将其移动到随机位置,但这非常慢。 然后我使用完整的数据集并挑选随机项目,这没关系,但可能更好。
对我来说,性能最佳的解决方案是选择随机数,取最小值和最大值并使用以下方法查询数据库:
db.collection.find({...}).skip(min).limit(max-min);
然后我只是迭代一次结果并比较一个以i = min开头的索引;我++;并且仅获取与随机集中的数字匹配的项目。对我来说,也可以随机限制最小和最大的面积。我使用对数方法根据我的集合大小选择最小 - 最大窗口的大小。
结果是一种非常快速的方法来选择随机结果集。
希望这对某些人也有帮助。
---丹