我想从MongoDB数据库中检索一组随机文档。到目前为止,在大量搜索之后,我只看到了检索一个随机文档或一组文档的方法,从一个随机跳过的位置开始,但是文档仍然是顺序的。
我试过猫鼬-简单-随机,不幸的是,它没有检索一个“真正的”随机集。它所做的是跳到一个随机位置,然后从该位置检索n个文档。
相反,我想检索一个随机集,就像MySQL使用one查询(或最小数量的查询)所做的那样,而且每次我都需要这个列表是随机的。我需要这是有效的--与MySQL类似的查询相当。我想在MongoDB中复制以下内容:
SELECT * FROM products ORDER BY rand() LIMIT 50;这个是可能的吗?我使用的是“猫鼬”,但是任何适配器--甚至是直接的MongoDB查询--的例子都是很酷的。
我看到了一种向每个文档中添加字段的方法,为每个字段生成一个随机值,并使用{rand: {$gte:rand()}}随机地使用我们想要的每个查询。但是,我担心的是,理论上两个查询可以返回相同的集合。
发布于 2014-12-08 02:03:42
您可以执行两个请求,但以一种有效的方式:
db.products.find({}, { '_id' : 1 })。特别重要的是,索引完全支持您的第一个查询(因为它是"_id")。这个索引很可能完全存在于内存中(否则可能会出现性能问题)。因此,在运行第一个查询时,只读取索引,而且速度非常快。
虽然第二个查询意味着读取实际文档,但是索引会有很大帮助。
如果你能这样做,你应该试一试。
发布于 2014-12-08 17:20:42
我不认为MySQL ORDER BY rand()特别有效--据我所知,它实际上为每一行分配了一个随机数,然后对这个随机数列上的表进行排序,并返回最上面的N个结果。
如果您愿意接受集合插入的一些开销,则可以将问题简化为在一个范围内生成N个随机整数。在每个文档中添加一个计数器字段:依次为每个文档分配一个唯一的正整数。只要赋值是唯一的,并且编号是顺序的,那么什么文档都不需要得到多少数字,而且您要么不删除文档,要么让反文档方案复杂化以处理漏洞。你可以通过两步插入来实现这一点。在一个单独的counter集合中,保留一个没有用于计数器的第一个数字的文档。当插入发生时,首先findAndModify计数器文档以检索下一个计数器值并原子地增加计数器值。然后插入带有计数器值的新文档。若要查找N个随机值,请找到最大计数器值,然后在最大计数器定义的范围内生成N个不同的随机数,然后使用$in检索文档。大多数语言都应该有能够在一个范围内生成N个随机整数的随机库。
https://stackoverflow.com/questions/27348811
复制相似问题