MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

3 sposoby na zwrócenie losowej próbki dokumentów z kolekcji MongoDB

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 }

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $exp

  2. Jaki jest najszybszy sposób skopiowania kolekcji w tej samej bazie danych?

  3. Konfiguracja środowiska MongoDB | Zainstaluj MongoDB w systemie Windows

  4. MongoDB $toString

  5. Czy istnieje sposób na odzyskanie ostatnio usuniętych dokumentów w MongoDB?