Från och med MongoDB 3.4.9 är en del av orsaken till den fördom du har observerat att $sample
förlitar sig nästan helt på lagringsmotorns slumpmässiga markörimplementering (se SERVER-19183
). Detta görs så att $sample
skulle kunna fungera när samlingen innehåller mycket data. Men eftersom lagringsmotorn lagrar dokument i en sorterad ordning med en implementering av B-trädtyp, är det inte alltid möjligt att skapa ett verkligt slumpmässigt resultat.
Det finns för närvarande två funktionsförfrågningar för bättre $sample
mekanik, nämligen SERVER-22069
och SERVER-22068
.
Med det sagt, om du behöver ett verkligt objektivt urval av dina data, rulla ditt eget $sample
-liknande lösning är troligen det bästa sättet att gå vidare vid denna tidpunkt. Något i stil med:
- Få en lista över alla
_id
i samlingen. - Utför ett slumpmässigt urval på den här listan (t.ex. med Pythons slumpmässiga .choice ).
- Hämta alla relevanta dokument med hjälp av den provade
_id
, som kommer att fungera rimligt beroende på vilken urvalsstorlek du vill ha, eftersom_id
är alltid indexerad.