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
_idna 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.