A partir do MongoDB 3.4.9, parte do motivo do viés que você observou é que
$sample
depende quase inteiramente da implementação do cursor aleatório do mecanismo de armazenamento (consulte SERVER-19183
). Isso é feito para que $sample
pode ter bom desempenho quando a coleção contém muitos dados. No entanto, como o mecanismo de armazenamento armazena documentos em uma ordem de classificação usando uma implementação do tipo árvore B, nem sempre é possível criar um resultado realmente aleatório. Existem atualmente duas solicitações de recursos para melhor
$sample
mecânica, ou seja, SERVER-22069
e SERVER-22068
. Dito isto, se você precisar de amostras verdadeiramente imparciais de seus dados, rolando seu próprio
$sample
-like é provavelmente a melhor maneira de proceder neste momento. Algo como:- Obter uma lista de todos os
_id
na coleção. - Faça uma amostragem aleatória nesta lista (por exemplo, usando o random) do Python .escolha ).
- Obtenha todos os documentos relevantes usando a amostra
_id
, que terá um desempenho razoável dependendo do tamanho da amostra que você deseja, pois_id
é sempre indexado.