首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以从MongoDB中检索多个随机的、非顺序的文档吗?

可以从MongoDB中检索多个随机的、非顺序的文档吗?
EN

Stack Overflow用户
提问于 2014-12-07 22:49:07
回答 2查看 987关注 0票数 4

我想从MongoDB数据库中检索一组随机文档。到目前为止,在大量搜索之后,我只看到了检索一个随机文档或一组文档的方法,从一个随机跳过的位置开始,但是文档仍然是顺序的。

我试过猫鼬-简单-随机,不幸的是,它没有检索一个“真正的”随机集。它所做的是跳到一个随机位置,然后从该位置检索n个文档。

相反,我想检索一个随机集,就像MySQL使用one查询(或最小数量的查询)所做的那样,而且每次我都需要这个列表是随机的。我需要这是有效的--与MySQL类似的查询相当。我想在MongoDB中复制以下内容:

代码语言:javascript
复制
SELECT * FROM products ORDER BY rand() LIMIT 50;

这个是可能的吗?我使用的是“猫鼬”,但是任何适配器--甚至是直接的MongoDB查询--的例子都是很酷的。

我看到了一种向每个文档中添加字段的方法,为每个字段生成一个随机值,并使用{rand: {$gte:rand()}}随机地使用我们想要的每个查询。但是,我担心的是,理论上两个查询可以返回相同的集合。

EN

回答 2

Stack Overflow用户

发布于 2014-12-08 02:03:42

您可以执行两个请求,但以一种有效的方式:

  1. 您的第一个请求只获得集合文档的所有"_id“列表。一定要使用芒果投影db.products.find({}, { '_id' : 1 })
  2. 你有一个"_id“的列表,从列表中随机选择N个。
  3. 使用$in操作符执行第二个查询。

特别重要的是,索引完全支持您的第一个查询(因为它是"_id")。这个索引很可能完全存在于内存中(否则可能会出现性能问题)。因此,在运行第一个查询时,只读取索引,而且速度非常快。

虽然第二个查询意味着读取实际文档,但是索引会有很大帮助。

如果你能这样做,你应该试一试。

票数 2
EN

Stack Overflow用户

发布于 2014-12-08 17:20:42

我不认为MySQL ORDER BY rand()特别有效--据我所知,它实际上为每一行分配了一个随机数,然后对这个随机数列上的表进行排序,并返回最上面的N个结果。

如果您愿意接受集合插入的一些开销,则可以将问题简化为在一个范围内生成N个随机整数。在每个文档中添加一个计数器字段:依次为每个文档分配一个唯一的正整数。只要赋值是唯一的,并且编号是顺序的,那么什么文档都不需要得到多少数字,而且您要么不删除文档,要么让反文档方案复杂化以处理漏洞。你可以通过两步插入来实现这一点。在一个单独的counter集合中,保留一个没有用于计数器的第一个数字的文档。当插入发生时,首先findAndModify计数器文档以检索下一个计数器值并原子地增加计数器值。然后插入带有计数器值的新文档。若要查找N个随机值,请找到最大计数器值,然后在最大计数器定义的范围内生成N个不同的随机数,然后使用$in检索文档。大多数语言都应该有能够在一个范围内生成N个随机整数的随机库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27348811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档