定义
$sample从输入文档中随机选择指定数量的文档。
$sample阶段语法:{ $sample: { size: <positive integer N> } }N是随机选择的文档数量。 将N设置为大于或等于1的整数。
行为
伪随机游标行为
如果以下所有条件都成立,则 $sample 将使用伪随机游标来选择 N 文档:
$sample是管道的第一个阶段。该集合包含 100 多个文档。
伪随机游标不能保证均匀的随机示例。它通过随机遍历集合内部的 B-Tree 结构来选择文档,因此结果可能会偏向集合的某些部分。在以下情况下,更有可能出现偏差:
集合中的文档未均匀分布,这会导致不平衡的树结构。
该集合包含大量已删除的文档。
大量文档对游标的事务不可见。
如果您的使用案例需要均匀的示例,请避免使用伪随机游标。为此,请在另一个阶段之后运行 $sample,或者将 N 设置为超过集合中 5% 的文档。
随机排序行为
如果前面有任何条件是错误的,$sample:
读取之前的聚合阶段或集合扫描输出的所有文档。
分片集群
如果在分片集群中使用 $sample,则每个分片都会独立执行采样操作。mongos 对每个分片的采样操作的合并结果进行采样,并返回所请求的文档数。
示例
以下示例使用 sample_mflix 示例数据集中的 movies 集合。有关如何将此数据集加载到部署中的详细信息,请参阅 加载示例数据集。
以下聚合操作从 movies 集合中随机选择 3 个文档:
db.movies.aggregate( [ { $sample: { size: 3 } }, { $project: { _id: 0, title: 1, year: 1, genres: 1 } } ])此操作会返回三个随机文档。
要使用MongoDB .NET/C# 驱动程序将 $sample 阶段添加到聚合管道,请对 PipelineDefinition 对象调用 UnionWith() 方法。
以下示例创建了一个管道阶段,该阶段从输入集合中返回五个随机文档:
var pipeline = new EmptyPipelineDefinition<Movie>() .Sample(5);要使用MongoDB Node.js驱动程序将 $sample 阶段添加到聚合管道,请在管道对象中使用 $sample操作符。
以下示例创建了一个管道阶段,该阶段从输入集合中返回五个随机文档。然后,该示例运行聚合管道:
const pipeline = [{ $sample: { size: 5 } }];
const cursor = collection.aggregate(pipeline);return cursor;