MongoDB 随机查询获取一条或 N 条记录的方法

💡 原文中文,约2000字,阅读约需5分钟。
📝

内容提要

在 MongoDB 中,可以使用 $sample 聚合操作随机获取 N 条记录。通过命令 db.users.aggregate( [ { $sample: { size: N } } ] ),可以从集合中获取随机记录。$sample 的选择方式取决于文档数量和集合大小,可能会返回重复记录。

🎯

关键要点

  • 在 MongoDB 中,可以使用 $sample 聚合操作随机获取 N 条记录。

  • 使用命令 db.users.aggregate( [ { $sample: { size: N } } ] ) 可以从集合中获取随机记录。

  • $sample 的选择方式取决于文档数量和集合大小,可能会返回重复记录。

  • 当 $sample 处于聚合管道的第一阶段且 N 小于总文档数量的 5% 且集合中的文档数量大于 100 时,$sample 将通过伪随机的游标获取记录。

  • 如果不满足上述条件,$sample 将进行集合扫描并通过随机排序选择记录。

  • 使用随机排序时,排序操作有 100 MB 的内存限制。

🔎

延伸解读

随机查询的效率

在使用 $sample 进行随机查询时,效率受多个因素影响。特别是当文档数量较大时,若不满足伪随机游标的条件,系统将进行集合扫描,这可能导致性能下降。因此,在设计数据库查询时,需考虑集合的大小和查询的复杂性,以优化性能。

内存限制的影响

使用随机排序获取记录时,MongoDB 对排序操作有 100 MB 的内存限制。这意味着在处理大数据集时,可能会遇到内存不足的问题,导致查询失败或性能下降。开发者应关注这一限制,必要时考虑分批查询或优化数据结构。

重复记录的风险

使用 $sample 时,可能会多次返回相同的记录。这在某些应用场景下可能影响数据的随机性和多样性,尤其是在需要高随机性的情况下。开发者应根据具体需求评估这一特性,并考虑是否需要额外的去重逻辑。

延伸问答

如何在 MongoDB 中随机获取 N 条记录?

可以使用命令 db.users.aggregate( [ { $sample: { size: N } } ] ) 来随机获取 N 条记录。

$sample 操作的选择方式是什么?

$sample 的选择方式取决于文档数量和集合大小,可能会返回重复记录。

在什么条件下 $sample 会使用伪随机游标?

当 $sample 处于聚合管道的第一阶段,N 小于总文档数量的 5%,且集合中的文档数量大于 100 时,$sample 会使用伪随机游标。

使用随机排序时有什么内存限制?

使用随机排序时,排序操作有 100 MB 的内存限制。

如果不满足 $sample 的条件,会发生什么?

如果不满足条件,$sample 将进行集合扫描,并通过随机排序选择记录。

在大集合中获取随机记录的效率如何?

在一张十亿级的集合上获取 1W 条随机记录,耗时约 2.5 秒。

🏷️

标签

➡️

继续阅读