Jeśli chcesz zwrócić małą próbkę losowych dokumentów z kolekcji, oto trzy metody, które możesz wypróbować, korzystając z potoku agregacji.
$sample
Scena
$sample
etap potoku agregacji jest zaprojektowany specjalnie do losowego wyboru określonej liczby dokumentów.
Gdy używasz $sample
, określasz liczbę dokumentów, które chcesz zwrócić w size
pole.
Załóżmy, że mamy następującą kolekcję o nazwie pets
:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 7, "name" : "Punch", "type" : "Gorilla", "weight" : 300 } { "_id" : 8, "name" : "Snap", "type" : "Crocodile", "weight" : 400 } { "_id" : 9, "name" : "Flutter", "type" : "Hummingbird", "weight" : 1 }
Możemy użyć $sample
aby pobrać losową próbkę tych dokumentów, tak jak ten:
db.pets.aggregate( [ { $sample: { size: 3 } } ] )
Wynik:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
W tym przypadku określiłem { size: 3 }
który zwrócił trzy dokumenty.
Tutaj znowu używa innego rozmiaru próbki:
db.pets.aggregate(
[
{
$sample: { size: 5 }
}
]
)
Wynik:
{ "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 8, "name" : "Snap", "type" : "Crocodile", "weight" : 400 } { "_id" : 7, "name" : "Punch", "type" : "Gorilla", "weight" : 300 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
$sample
stage działa na dwa sposoby, w zależności od liczby dokumentów w kolekcji, wielkości próbki w stosunku do liczby dokumentów w kolekcji oraz jej pozycji w potoku. Zobacz MongoDB $sample
po wyjaśnienie, jak to działa.
Możliwe też, że $sample
stage może zwrócić ten sam dokument więcej niż raz w zestawie wyników.
$rand
Operator
$rand
Operator został wprowadzony w MongoDB 4.4.2, a jego celem jest zwrócenie losowej liczby zmiennoprzecinkowej od 0 do 1 przy każdym wywołaniu.
Dlatego możemy go użyć w $match
stage w połączeniu z innymi operatorami, takimi jak $expr
i $lt
aby zwrócić losową próbkę dokumentów.
Przykład:
db.pets.aggregate(
[
{
$match:
{
$expr:
{
$lt: [ 0.5, { $rand: {} } ]
}
}
}
]
)
Wynik:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 9, "name" : "Flutter", "type" : "Hummingbird", "weight" : 1 }
Zestaw wyników z tego podejścia różni się od $sample
podejście, polegające na tym, że nie zwraca ustalonej liczby dokumentów. Liczba dokumentów zwracanych w ten sposób może się różnić.
Na przykład, oto co się dzieje, gdy kilka razy uruchomię ten sam kod.
Zestaw wyników 2:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 7, "name" : "Punch", "type" : "Gorilla", "weight" : 300 } { "_id" : 8, "name" : "Snap", "type" : "Crocodile", "weight" : 400 }
Zestaw wyników 3:
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 9, "name" : "Flutter", "type" : "Hummingbird", "weight" : 1 }
Zestaw wyników 4:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 8, "name" : "Snap", "type" : "Crocodile", "weight" : 400 }
Zestaw wyników 5:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 7, "name" : "Punch", "type" : "Gorilla", "weight" : 300 } { "_id" : 8, "name" : "Snap", "type" : "Crocodile", "weight" : 400 } { "_id" : 9, "name" : "Flutter", "type" : "Hummingbird", "weight" : 1 }
$sampleRate
Operator
Wprowadzony w MongoDB 4.4.2, $sampleRate
operator zapewnia bardziej zwięzły sposób robienia tego samego, co w poprzednim przykładzie.
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:
db.pets.aggregate(
[
{
$match: { $sampleRate: 0.5 }
}
]
)
Wynik:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 } { "_id" : 7, "name" : "Punch", "type" : "Gorilla", "weight" : 300 } { "_id" : 8, "name" : "Snap", "type" : "Crocodile", "weight" : 400 }
I uruchom go ponownie:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 7, "name" : "Punch", "type" : "Gorilla", "weight" : 300 } { "_id" : 8, "name" : "Snap", "type" : "Crocodile", "weight" : 400 } { "_id" : 9, "name" : "Flutter", "type" : "Hummingbird", "weight" : 1 }
I znowu:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 8, "name" : "Snap", "type" : "Crocodile", "weight" : 400 }