Definición
$sampleRateCoincide con una selección aleatoria de documentos de entrada. El número de documentos seleccionados se aproxima a la tasa de muestra expresada como un porcentaje del total de documentos.
El operador
$sampleRatetiene la siguiente sintaxis:{ $sampleRate: <non-negative float> }
Comportamiento
El proceso de selección utiliza una distribución aleatoria uniforme. La tasa de muestreo es un número de punto flotante entre 0 y 1, inclusive, que representa la probabilidad de que un documento dado sea seleccionado a medida que pasa por la pipeline.
Por ejemplo, una tasa de muestreo de 0.33 selecciona aproximadamente un documento de cada tres.
Esta expresión:
{ $match: { $sampleRate: 0.33 } }
es equivalente a usar el/la $rand operador de la siguiente manera:
{ $match: { $expr: { $lt: [ { $rand: {} }, 0.33 ] } } }
Ejecutar varias veces los mismos datos producirá resultados diferentes, ya que el proceso de selección es no determinístico. En general, los conjuntos de datos más pequeños presentarán una mayor variabilidad en la cantidad de documentos seleccionados en cada ejecución. A medida que aumenta el tamaño de la colección, el número de documentos elegidos se acercará al valor esperado para una distribución aleatoria uniforme.
Nota
Si se requiere un número exacto de documentos de cada ejecución, se debe utilizar el operador $sample en lugar de $sampleRate.
Ejemplos
Este código crea una pequeña colección con 100 documentos.
N = 100 bulk = db.collection.initializeUnorderedBulkOp() for ( i = 0; i < N; i++) { bulk.insert( {_id: i, r: 0} ) } bulk.execute()
El operador $sampleRate se puede usar en una pipeline para seleccionar documentos aleatorios de la colección. En este ejemplo utilizamos $sampleRate para seleccionar aproximadamente un tercio de los documentos.
db.collection.aggregate( [ { $match: { $sampleRate: 0.33 } }, { $count: "numMatches" } ] )
Esta es la salida de 5 ejecuciones en la colección de muestra:
{ "numMatches" : 38 } { "numMatches" : 36 } { "numMatches" : 29 } { "numMatches" : 29 } { "numMatches" : 28 }