$sampleRate (agregação)
Nesta página
Definição
$sampleRate
Corresponde a uma seleção aleatória de documentos de entrada. O número de documentos selecionados aproxima a taxa de amostragem expressa como uma porcentagem do número total de documentos.
O operador
$sampleRate
tem a seguinte sintaxe:{ $sampleRate: <non-negative float> }
Comportamento
O processo de seleção utiliza uma distribuição aleatória uniforme. A taxa de amostragem é um número de ponto flutuante entre 0 e 1, inclusive, que representa a probabilidade de que um determinado documento seja selecionado à medida que passa pelo pipeline.
Por exemplo, uma taxa de amostragem de 0.33
seleciona aproximadamente um documento em três.
Esta expressão:
{ $match: { $sampleRate: 0.33 } }
é equivalente a usar o operador $rand
da seguinte forma:
{ $match: { $expr: { $lt: [ { $rand: {} }, 0.33 ] } } }
Execuções repetidas nos mesmos dados produzirão resultados diferentes, pois o processo de seleção não é determinístico. Em geral, conjuntos de dados menores mostrarão mais variabilidade no número de documentos selecionados em cada execução. À medida que o tamanho da collection aumenta, o número de documento escolhidos se aproximará do valor esperado para uma distribuição aleatória uniforme.
Observação
Se um número exato de documentos for exigido de cada execução, o operador $sample
deverá ser usado em vez de $sampleRate
.
Exemplos
Este código cria uma pequena coleção com 100 documentos.
N = 100 bulk = db.collection.initializeUnorderedBulkOp() for ( i = 0; i < N; i++) { bulk.insert( {_id: i, r: 0} ) } bulk.execute()
O operador $sampleRate
pode ser usado em um pipeline para selecionar documento aleatórios da collection. Neste exemplo, usamos $sampleRate
para selecionar cerca de um terceiro dos documentos.
db.collection.aggregate( [ { $match: { $sampleRate: 0.33 } }, { $count: "numMatches" } ] )
Este é o resultado de 5 execuções na collection de amostras:
{ "numMatches" : 38 } { "numMatches" : 36 } { "numMatches" : 29 } { "numMatches" : 29 } { "numMatches" : 28 }