sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $muestra

En MongoDB, el $sample etapa de canalización de agregación selecciona aleatoriamente el número especificado de documentos de su entrada.

Ejemplo

Supongamos que tenemos una colección llamada employees con los siguientes documentos:

{ "_id" : 1, "name" : "Bob", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Christopher", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }
{ "_id" : 6, "name" : "Homer", "salary" : 1 }
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
{ "_id" : 8, "name" : "Zoro", "salary" : 300000 }
{ "_id" : 9, "name" : "Xena", "salary" : 382000 }

Podemos usar el $sample etapa para seleccionar aleatoriamente un número específico de documentos de esa colección.

Ejemplo:

db.employees.aggregate(
   [
      { 
        $sample: { size: 3 } 
      }
   ]
)

Resultado:

{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }

En este caso especifiqué que el tamaño de la muestra es 3. Podemos ver que se devolvieron tres documentos en orden aleatorio.

Aquí está el resultado si cuando vuelvo a ejecutar el mismo código:

{ "_id" : 1, "name" : "Bob", "salary" : 55000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 9, "name" : "Xena", "salary" : 382000 }

Obtenemos una selección diferente de documentos.

Podemos aumentar el tamaño de la muestra aumentando el número.

Ejemplo:

db.employees.aggregate(
   [
      { 
        $sample: { size: 5 } 
      }
   ]
)

Resultado:

{ "_id" : 9, "name" : "Xena", "salary" : 382000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Christopher", "salary" : 45000 }
{ "_id" : 8, "name" : "Zoro", "salary" : 300000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Devolver aleatoriamente todos los documentos

Si el tamaño de la muestra solicitada coincide o es mayor que la cantidad de documentos de la colección, todos los documentos se devuelven en orden aleatorio.

Ejemplo:

db.employees.aggregate(
   [
      { 
        $sample: { size: 100 } 
      }
   ]
)

Resultado:

{ "_id" : 4, "name" : "Christopher", "salary" : 45000 }
{ "_id" : 8, "name" : "Zoro", "salary" : 300000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 6, "name" : "Homer", "salary" : 1 }
{ "_id" : 9, "name" : "Xena", "salary" : 382000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
{ "_id" : 1, "name" : "Bob", "salary" : 55000 }

Cómo $sample Calcula el resultado

El $sample etapa utiliza uno de dos métodos para producir el resultado. El método real utilizado depende del escenario.

La siguiente tabla describe qué método se usa para cada escenario.

Escenario Método utilizado para producir los resultados
Se cumplen todas las condiciones siguientes:
$sample es la primera etapa del oleoducto
– El tamaño de muestra especificado es inferior al 5 % del total de documentos de la colección
– La colección contiene más de 100 documentos
$sample utiliza un cursor pseudoaleatorio para seleccionar documentos.
Todas las condiciones anteriores no conocido. $sample realiza un escaneo de colección seguido de una ordenación aleatoria para seleccionar el número especificado de documentos.

Duplicados

La documentación de MongoDB advierte que $sample puede generar el mismo documento más de una vez en su conjunto de resultados.