W MongoDB $sampleRate
etap potoku agregacji dopasowuje losowy wybór dokumentów wejściowych.
Liczba wybranych dokumentów jest przybliżoną częstotliwością próbkowania wyrażoną jako procent całkowitej liczby dokumentów.
$sampleRate
operator został wprowadzony w MongoDB 4.4.2.
Gdy używasz $sampleRate
, podajesz częstotliwość próbkowania jako liczbę zmiennoprzecinkową między 0
i 1
. Proces selekcji wykorzystuje jednolity losowy rozkład, a podana częstotliwość próbkowania reprezentuje prawdopodobieństwo, że dany dokument zostanie wybrany podczas przechodzenia przez potok.
Przykład
Załóżmy, że mamy kolekcję o nazwie employees
z następującymi dokumentami:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Christopher", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 } { "_id" : 9, "name" : "Xena", "salary" : 382000 }
Możemy użyć $sample
etap, aby losowo wybrać określoną liczbę dokumentów z tej kolekcji.
Przykład:
db.employees.aggregate(
[
{
$match: { $sampleRate: 0.33 }
}
]
)
Wynik:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 }
Zapewniając częstotliwość próbkowania 0.33
, określiliśmy, że około jedna trzecia dokumentów powinna zostać zwrócona.
Jednak rzeczywisty wynik może się znacznie różnić w zależności od tego, ile dokumentów znajduje się w kolekcji. Kolekcje z mniejszą liczbą dokumentów będą miały dość zróżnicowane wyniki, podczas gdy większe zbiory powinny być bliższe oczekiwanemu jednolitemu rozkładowi losowemu.
Aby to zademonstrować, oto zestaw wyników, który otrzymuję, gdy ponownie uruchamiam ten sam kod:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Christopher", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
I znowu:
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 }
I jeszcze raz:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
Jest to mniejsza kolekcja, więc wyniki znacznie się różnią.
Jeśli chcesz zwrócić dokładną liczbę dokumentów, użyj $sample
zamiast tego na scenie.