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

我想从MongoDB数据库中检索一组随机文档.到目前为止,经过大量的谷歌搜索,我只看到了从随机跳过位置开始检索一个随机文档或一组文档的方法,但文档仍然是连续的.

我尝试过mongoose-simple-random,不幸的是它没有检索到“真正的”随机集.它的作用是跳到随机位置,然后从该位置检索n个文档.

相反,我想检索一个像MySQL这样的随机集合使用一个查询(或最少量的查询),我每次都需要这个列表是随机的.我需要这个效率 – 与MySQL的这种查询相对.我想在MongoDB中重现以下内容:

SELECT * FROM products ORDER BY rand() LIMIT 50;

这可能吗?我正在使用Mongoose,但是任何适配器的示例 – 甚至是直接的MongoDB查询 – 都很酷.

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

最佳答案 您可以做两个请求,但是以有效的方式:

>您的第一个请求只会获取您的收藏集的所有“_id”文档列表.一定要使用mongo投影db.products.find({},{‘_ id’:1}).
>你有一个“_id”列表,只需从列表中随机选择N.
>使用$in运算符执行第二次查询.

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

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

如果你可以这样做,你应该尝试.

点赞