Od MongoDB 3.4.9, jedną z przyczyn zaobserwowanego błędu jest to, że $sample
opiera się prawie całkowicie na implementacji losowego kursora silnika pamięci masowej (patrz SERVER-19183
). Odbywa się to tak, że $sample
może być wydajna, gdy kolekcja zawiera dużo danych. Jednak ponieważ silnik pamięci przechowuje dokumenty w posortowanej kolejności przy użyciu implementacji typu B-drzewo, nie zawsze jest możliwe utworzenie naprawdę losowego wyniku.
Obecnie istnieją dwie prośby o lepszą funkcję $sample
mechanika, czyli SERVER-22069
i SERVER-22068
.
To powiedziawszy, jeśli potrzebujesz naprawdę bezstronnych próbek swoich danych, użyj własnego $sample
-podobne rozwiązanie jest prawdopodobnie najlepszym sposobem postępowania w tym momencie. Coś takiego:
- Pobierz listę wszystkich
_id
w kolekcji. - Wykonaj losowe próbkowanie z tej listy (np. używając random Pythona .wybór ).
- Uzyskaj wszystkie odpowiednie dokumenty, korzystając z próbki
_id
, co będzie dość wydajne w zależności od żądanej wielkości próbki, ponieważ_id
jest zawsze indeksowany.