采样率(聚合)
定义
$sampleRate
匹配一组随机输入文档。所选文档的数量大致等于总文档数量的样本率(百分比表示)。
语法
$sampleRate
运算符具有以下语法{ $sampleRate: <non-negative float> }
行为
选择过程使用均匀随机分布。样本率是一个介于0和1之间的浮点数(包含0和1),表示给定文档在通过管道时被选中的概率。
例如,样本率0.33
大致会选择每三个文档中的一个。
此表达式
{ $match: { $sampleRate: 0.33 } }
等同于使用$rand
运算符如下
{ $match: { $expr: { $lt: [ { $rand: {} }, 0.33 ] } } }
在相同的数据上重复运行会产生不同的结果,因为选择过程是非确定性的。一般来说,较小数据集在每次运行中选择的文档数量变化更大。随着集合大小的增加,选择的文档数量将接近均匀随机分布的预期值。
注意
如果需要从每次运行中获取确切的文档数量,应使用$sample
运算符而不是$sampleRate
。
示例
此代码创建了一个包含100个文档的小集合。
N = 100 bulk = db.collection.initializeUnorderedBulkOp() for ( i = 0; i < N; i++) { bulk.insert( {_id: i, r: 0} ) } bulk.execute()
$sampleRate
运算符可以在管道中用来从集合中选择随机文档。在这个例子中,我们使用$sampleRate
来选择大约三分之一的文档。
db.collection.aggregate( [ { $match: { $sampleRate: 0.33 } }, { $count: "numMatches" } ] )
这是在样本集合上运行5次的结果
{ "numMatches" : 38 } { "numMatches" : 36 } { "numMatches" : 29 } { "numMatches" : 29 } { "numMatches" : 28 }