No MongoDB, o
$sample
O estágio de pipeline de agregação seleciona aleatoriamente o número especificado de documentos de sua entrada. Exemplo
Suponha que tenhamos uma coleção chamada
employees
com os seguintes 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 o
$sample
etapa para selecionar aleatoriamente um número especificado de documentos dessa coleção. Exemplo:
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 }
Nesse caso, especifiquei que o tamanho da amostra é 3. Podemos ver que três documentos foram devolvidos em ordem aleatória.
Aqui está o resultado se quando eu executar o mesmo código novamente:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 9, "name" : "Xena", "salary" : 382000 }
Recebemos uma seleção diferente de documentos.
Podemos aumentar o tamanho da amostra aumentando o número.
Exemplo:
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 os documentos
Se o tamanho da amostra solicitada corresponder ou for maior que o número de documentos da coleção, todos os documentos serão devolvidos em ordem aleatória.
Exemplo:
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 }
Como $sample
Calcula o resultado
O
$sample
stage usa um dos dois métodos para produzir o resultado. O método real usado depende do cenário. A tabela a seguir descreve qual método é usado para cada cenário.
Cenário | Método usado para produzir os resultados |
---|---|
Todas as condições a seguir são atendidas: – $sample é a primeira fase do pipeline – O tamanho da amostra especificado é inferior a 5% do total de documentos na coleção – A coleção contém mais de 100 documentos | $sample usa um cursor pseudo-aleatório para selecionar documentos. |
Todas as condições acima não atendido. | $sample executa uma varredura de coleção seguida por uma classificação aleatória para selecionar o número especificado de documentos. |
Duplicados
A documentação do MongoDB avisa que
$sample
pode gerar o mesmo documento mais de uma vez em seu conjunto de resultados.