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.