MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $ amostra


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.