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.