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 }