A partire da MongoDB 3.4.9, parte del motivo della distorsione che hai osservato è che $sample
si basa quasi interamente sull'implementazione del cursore casuale del motore di archiviazione (vedi SERVER-19183
). Questo viene fatto in modo che $sample
potrebbe essere performante quando la raccolta contiene molti dati. Tuttavia, poiché il motore di archiviazione archivia i documenti in un ordine ordinato utilizzando un'implementazione di tipo B-tree, non è sempre possibile creare un risultato veramente casuale.
Al momento ci sono due richieste di funzionalità per un migliore $sample
meccanica, ovvero SERVER-22069
e SERVER-22068
.
Detto questo, se hai bisogno di campioni davvero imparziali dei tuoi dati, lancia il tuo $sample
-like è probabilmente il modo migliore per procedere a questo punto. Qualcosa come:
- Ottieni un elenco di tutti i
_id
nella collezione. - Esegui un campionamento casuale su questo elenco (ad es. utilizzando random di Python .scelta ).
- Ottieni tutti i documenti pertinenti utilizzando il campione
_id
, che sarà ragionevolmente performante a seconda della dimensione del campione che desideri, poiché_id
è sempre indicizzato.