Depuis MongoDB 3.4.9, une partie de la raison du biais que vous avez observé est que $sample
repose presque entièrement sur l'implémentation du curseur aléatoire du moteur de stockage (voir SERVER-19183
). Ceci est fait pour que $sample
peut être performant lorsque la collection contient beaucoup de données. Cependant, étant donné que le moteur de stockage stocke les documents dans un ordre trié à l'aide d'une implémentation de type B-tree, il n'est pas toujours possible de créer un résultat vraiment aléatoire.
Il y a actuellement deux demandes de fonctionnalités pour améliorer $sample
mécanique, à savoir SERVER-22069
et SERVER-22068
.
Cela dit, si vous avez besoin d'échantillons vraiment impartiaux de vos données, lancez votre propre $sample
- comme solution est probablement la meilleure façon de procéder à ce stade. Quelque chose comme :
- Obtenir une liste de tous les
_id
dans la collection. - Effectuez un échantillonnage aléatoire sur cette liste (par exemple, en utilisant Python random .choix ).
- Obtenez tous les documents pertinents à l'aide de l'échantillon
_id
, qui sera raisonnablement performant en fonction de la taille d'échantillon souhaitée, puisque_id
est toujours indexé.