MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Campione casuale di MongoDB che restituisce risultati fortemente distorti

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:

  1. Ottieni un elenco di tutti i _id nella collezione.
  2. Esegui un campionamento casuale su questo elenco (ad es. utilizzando random di Python .scelta ).
  3. 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.