对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

$ 示例 (聚合阶段)

$sample

从输入文档中随机选择指定数量的文档。

$sample 阶段语法:

{ $sample: { size: <positive integer N> } }

N 是随机选择的文档数量。 将 N 设置为大于或等于 1 的整数。

如果以下所有条件都成立,则 $sample 将使用伪随机游标来选择 N 文档:

  • $sample 是管道的第一个阶段。

  • N 少于集合中文档总数的 5%。

    注意

    无法配置 $sample 用于确定何时扫描整个集合的阈值。阈值为 5%。如果大小超过集合中文档总数的 5%,$sample 将执行按生成的随机值排序的 top-k 排序。如果示例文档大于 100 MB,top-k 排序可能会溢出到磁盘。

  • 该集合包含 100 多个文档。

伪随机游标不能保证均匀的随机示例。它通过随机遍历集合内部的 B-Tree 结构来选择文档,因此结果可能会偏向集合的某些部分。在以下情况下,更有可能出现偏差:

  • 集合中的文档未均匀分布,这会导致不平衡的树结构。

  • 该集合包含大量已删除的文档。

  • 大量文档对游标的事务不可见。

如果您的使用案例需要均匀的示例,请避免使用伪随机游标。为此,请在另一个阶段之后运行 $sample,或者将 N 设置为超过集合中 5% 的文档。

如果前面有任何条件是错误的,$sample:

  • 读取之前的聚合阶段或集合扫描输出的所有文档。

  • 执行随机排序以选择 N 个文档。 随机排序受排序内存限制。

    注意

    视图是聚合管道的结果。当您在视图上使用 $sample 时,MongoDB 会将该阶段附加到视图聚合管道语法的末尾。因此,视图上的 $sample 阶段永远不是第一阶段,并且始终会导致集合扫描。

如果在分片集群中使用 $sample,则每个分片都会独立执行采样操作。mongos 对每个分片的采样操作的合并结果进行采样,并返回所请求的文档数。

以下示例使用 sample_mflix 示例数据集中的 movies 集合。有关如何将此数据集加载到部署中的详细信息,请参阅 加载示例数据集。

以下聚合操作从 movies 集合中随机选择 3 个文档:

db.movies.aggregate( [ { $sample: { size: 3 } }, { $project: { _id: 0, title: 1, year: 1, genres: 1 } } ])

此操作会返回三个随机文档。

给本页内容打分

在此页面上