Definição
$sampleSeleciona aleatoriamente o número especificado de documentos a partir dos documentos de entrada.
$samplesintaxe de estágio :{ $sample: { size: <positive integer N> } } Né o número de documentos para selecionar aleatoriamente. DefinaNcomo um número inteiro maior ou igual a1.
Comportamento
Comportamento pseudo-aleatório do cursor
Se todas as seguintes condições forem verdadeiras, o $sample usará um cursor pseudoaleatório para selecionar os documentos N:
$sampleé o primeiro estágio do pipeline.Né inferior a 5% do total de documentos na coleção.Observação
Não é possível configurar o limite que
$sampleusa para determinar quando verificar toda a coleção. O limite é 5%. Se o tamanho for maior que 5% do número total de documentos na collection,$sampleexecutará uma classificação top-k por um valor aleatório gerado. A classificação top-k pode ser transferido para o disco se os documentos de amostra forem maiores que 100MB.A coleção contém mais de 100 documentos.
O cursor pseudo-aleatório não garante uma amostra aleatória uniforme. Ele seleciona documentos descendentes da estrutura interna de B-tree da coleção aleatoriamente, de modo que os resultados possam se direcionar para algumas partes da coleção. O desvio é mais provável quando:
Os documentos da coleção não estão distribuídos uniformemente, o que leva a uma estrutura em árvore desequilibrada.
A collection tem um grande número de documentos excluídos.
Um grande número de documentos não está visível para a transação do cursor.
Se seu caso de uso exigir uma amostra uniforme, evite o cursor pseudo-aleatório. Para fazer isso, execute $sample após outro estágio ou defina N para mais de 5% dos documentos na coleção.
Comportamento de classificação aleatória
Se qualquer uma das condições anteriores for falsa, $sample:
Lê todos os documentos gerados de um estágio de agregação anterior ou de uma varredura de coleção.
Executa uma classificação aleatória para selecionar
Ndocumentos. As classificações aleatórias estão sujeitas às restrições de memória de classificação.Observação
As visualizações são o resultado de pipelines de agregação. Quando você usa
$sampleem um modo de exibição, o MongoDB acrescenta o estágio ao final da sintaxe do pipeline de agregação do modo de exibição. Portanto, o estágio$sampleem uma exibição nunca é o primeiro estágio e sempre resulta em uma varredura de coleção.
Clusters fragmentados
Se você usar $sample em um cluster fragmentado, cada fragmento executará a operação de amostra de forma independente. mongos faz uma amostra do resultado mesclado da operação de amostragem de cada fragmento e retorna o número solicitado de documentos.
Exemplos
Esta seção mostra um exemplo de pipeline de agregação que usa a seguinte coleção 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 } ] )
A seguinte operação de agregação seleciona aleatoriamente 3 documentos da coleção:
db.users.aggregate( [ { $sample: { size: 3 } } ] )
A operação retorna três documentos aleatórios.
Para usar o driver MongoDB .NET/C# para adicionar um $sample estágio a uma agregação pipeline, chame o método unionWith() em um PipelineDefinition objeto.
O exemplo abaixo cria um estágio de pipeline que retorna cinco documentos aleatórios da collection de entrada:
var pipeline = new EmptyPipelineDefinition<Movie>() .Sample(5);
Para usar o driver Node.js do MongoDB para adicionar um estágio $sample a um pipeline de agregação , use o operador $sample em um objeto de pipeline.
O exemplo a seguir cria um estágio de pipeline que retorna cinco documentos aleatórios da collection de entrada. Em seguida, o exemplo executa o agregação pipeline:
const pipeline = [{ $sample: { size: 5 } }]; const cursor = collection.aggregate(pipeline); return cursor;