A partir de MongoDB 3.4.9, parte del motivo del sesgo que ha observado es que $sample
se basa casi por completo en la implementación del cursor aleatorio del motor de almacenamiento (ver SERVER-19183
). Esto se hace para que $sample
podría ser eficaz cuando la colección contiene una gran cantidad de datos. Sin embargo, dado que el motor de almacenamiento almacena documentos en un orden ordenado utilizando una implementación de tipo árbol B, no siempre es posible crear un resultado verdaderamente aleatorio.
Actualmente hay dos solicitudes de funciones para mejorar $sample
mecánica, a saber, SERVER-22069
y SERVER-22068
.
Habiendo dicho eso, si necesita muestras verdaderamente imparciales de sus datos, genere su propio $sample
Es probable que una solución similar sea la mejor manera de proceder en este punto. Algo como:
- Obtener una lista de todos los
_id
en la colección. - Realice un muestreo aleatorio en esta lista (por ejemplo, usando Python random .elección ).
- Obtenga todos los documentos relevantes usando el
_id
de muestra , que tendrá un rendimiento razonable según el tamaño de muestra que desee, ya que_id
siempre está indexado.