Definición
$sampleSelecciona aleatoriamente la cantidad especificada de documentos de los documentos de entrada.
$samplesintaxis de etapa:{ $sample: { size: <positive integer N> } } Nes el número de documentos a seleccionar aleatoriamente. ConfiguraNen un número entero mayor o igual que1.
Comportamiento
Comportamiento del cursor pseudoaleatorio
Si se cumplen todas las siguientes condiciones, $sample utiliza un cursor pseudoaleatorio para seleccionar los documentos N:
$samplees la primera etapa de la pipeline.Nes menos del 5% de los documentos totales de la colección.Nota
No puede configurar el umbral que
$sampleutiliza para determinar cuándo escanear toda la colección. El umbral es del 5%. Si el tamaño es superior al 5% del número total de documentos de la colección,$samplerealiza una top-k ordenación por un valor aleatorio generado. La ordenación top-k podría desbordarse en el disco si los documentos de muestra superan los 100MB.La colección contiene más de 100 documentos.
El cursor pseudoaleatorio no da garantías de una muestra aleatoria uniforme. Selecciona documentos descendiendo aleatoriamente la estructura interna B-tree de la colección, por lo que los resultados pueden sesgarse hacia algunas partes de la colección. Es más probable que haya sesgo cuando:
Los documentos de la colección no están distribuidos uniformemente, lo que lleva a una estructura de árbol desequilibrada.
La colección tiene un número elevado de documentos borrados.
Un gran número de documentos no están visibles para la transacción del cursor.
Si su caso de uso requiere una muestra uniforme, evite el cursor pseudoaleatorio. Para ello, ejecute $sample después de otra etapa, o establezca N en más del 5% de los documentos de la colección.
Comportamiento de ordenación aleatoria
Si alguna de las condiciones anteriores es falsa, $sample:
Lee todos los documentos que se obtienen de una etapa de agregación anterior o de un escaneo de colección.
Realiza una ordenación aleatoria para seleccionar
Ndocumentos. Las ordenaciones aleatorias están sujetas a las restricciones de memoria de la ordenación.Nota
Las vistas son el resultado de pipelines de agregación. Cuando utiliza
$sampleen una vista, MongoDB añade la etapa al final de la sintaxis del pipeline de agregación de la vista. En consecuencia, la etapa$sampleen una vista nunca es la primera y siempre resulta en un escaneo de colección.
Clústeres fragmentados
Si usas $sample en un clúster fragmentado, cada partición realiza la operación de muestreo de forma independiente. mongos toma muestras del resultado combinado de la operación de muestreo de cada partición y devuelve el número solicitado de documentos.
Ejemplos
Esta sección muestra un ejemplo de un pipeline de agregación que utiliza la siguiente colección de 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 } ] )
La siguiente operación de agregación selecciona aleatoriamente 3 documentos de la colección:
db.users.aggregate( [ { $sample: { size: 3 } } ] )
La operación devuelve tres documentos aleatorios.
var pipeline = new EmptyPipelineDefinition<Movie>() .Sample(5);
Para utilizar el controlador de MongoDB Node.js para agregar una etapa de $sample a una canalización de agregación, utilice el Operador $sample en un objeto de canalización.
El siguiente ejemplo crea una etapa de pipeline que devuelve cinco documentos aleatorios de la colección de entrada. El ejemplo luego ejecuta la canalización de agregación:
const pipeline = [{ $sample: { size: 5 } }]; const cursor = collection.aggregate(pipeline); return cursor;