$sample (聚合查询)
定义
$sample
从输入文档中随机选择指定数量的文档。
$sample
阶段语法{ $sample: { size: <positive integer N> } } N
是要随机选择的文档数。将N
设置为一个大于或等于1
的整数。
行为
如果以下所有条件都为真,$sample
将使用伪随机游标选择 N
个文档
$sample
是管道的第一个阶段。N
小于集合中总文档的 5%。集合包含超过 100 个文档。
如果任何先前条件为假,$sample
:
读取来自先前聚合阶段或集合扫描的所有文档。
执行随机排序以选择
N
个文档。随机排序受 排序内存限制 的约束。注意
视图 是聚合管道的结果。当在视图中使用
$sample
时,MongoDB 将阶段追加到视图的聚合管道语法末尾。因此,视图上的$sample
阶段永远不会是第一个阶段,并且始终导致集合扫描。
如果在 分片集群 中使用 $sample
,则每个分片独立执行样本操作。 mongos
样本每个分片的样本操作合并结果,并返回请求的文档数。
示例
本节展示了使用以下 users
集合的聚合管道示例
db.users.insertMany( [ { _id : 1, name : "dave123", q1 : true, q2 : true }, { _id : 2, name : "dave2", q1 : false, q2 : false }, { _id : 3, name : "ahn", q1 : true, q2 : true }, { _id : 4, name : "li", q1 : true, q2 : false }, { _id : 5, name : "annT", q1 : false, q2 : true }, { _id : 6, name : "li", q1 : true, q2 : true }, { _id : 7, name : "ty", q1 : false, q2 : true } ] )
以下聚合操作从集合中随机选择 3
个文档
db.users.aggregate( [ { $sample: { size: 3 } } ] )
操作返回三个随机文档。