sql >> Database >  >> NoSQL >> MongoDB

3 manieren om een ​​willekeurig voorbeeld van documenten uit een MongoDB-verzameling te retourneren

Als u een kleine steekproef van willekeurige documenten uit een verzameling moet retourneren, zijn hier drie benaderingen die u kunt proberen met behulp van de aggregatiepijplijn.

De $sample Stadium

De $sample aggregatiepijplijnfase is speciaal ontworpen voor het willekeurig selecteren van een bepaald aantal documenten.

Wanneer u $sample . gebruikt , geeft u het aantal documenten op dat u wilt retourneren in een size veld.

Stel dat we de volgende verzameling hebben genaamd 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 }

We kunnen $sample . gebruiken om een ​​willekeurige steekproef van die documenten als volgt te nemen:

db.pets.aggregate(
   [
      { 
        $sample: { size: 3 } 
      }
   ]
)

Resultaat:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }

In dit geval heb ik { size: 3 } . opgegeven die drie documenten terugstuurde.

Hier is het weer met een andere steekproefomvang:

db.pets.aggregate(
   [
      { 
        $sample: { size: 5 } 
      }
   ]
)

Resultaat:

{ "_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 }

De $sample stage werkt op twee manieren, afhankelijk van het aantal documenten in de collectie, de steekproefomvang in verhouding tot het aantal documenten in de collectie en de positie in de pijplijn. Zie MongoDB $sample voor een uitleg over hoe het werkt.

Het is ook mogelijk dat de $sample stage zou hetzelfde document meer dan eens kunnen retourneren in de resultatenset.

De $rand Operator

De $rand operator is geïntroduceerd in MongoDB 4.4.2 en het doel is om elke keer dat het wordt aangeroepen een willekeurige float tussen 0 en 1 te retourneren.

Daarom kunnen we het gebruiken in de $match stage in combinatie met andere operators, zoals $expr en $lt om een ​​willekeurig voorbeeld van documenten te retourneren.

Voorbeeld:

db.pets.aggregate(
   [
      { 
        $match: 
          { 
            $expr: 
              { 
                $lt: [ 0.5, { $rand: {} } ] 
              }
          } 
      }
   ]
)

Resultaat:

{ "_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 }

De resultatenset van deze aanpak is anders dan de $sample aanpak, in die zin dat het geen vast aantal documenten retourneert. Het aantal documenten dat met deze aanpak wordt geretourneerd, kan variëren.

Dit is bijvoorbeeld wat er gebeurt als ik dezelfde code nog een paar keer uitvoer.

Resultaat set 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 }

Resultaatset 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 }

Resultaatset 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 }

Resultaatset 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 }

De $sampleRate Operator

Geïntroduceerd in MongoDB 4.4.2, de $sampleRate operator biedt een beknoptere manier om hetzelfde te doen als in het vorige voorbeeld.

Wanneer u $sampleRate gebruikt , geeft u een samplefrequentie op als een getal met drijvende komma tussen 0 en 1 . Het selectieproces maakt gebruik van een uniforme willekeurige verdeling en de steekproeffrequentie die u opgeeft, geeft de kans weer dat een bepaald document wordt geselecteerd terwijl het door de pijplijn gaat.

Voorbeeld:

db.pets.aggregate(
   [
      { 
        $match: { $sampleRate: 0.5 } 
      }
   ]
)

Resultaat:

{ "_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 }

En voer het opnieuw uit:

{ "_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 }

En nogmaals:

{ "_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. Specifiek deel van document ophalen

  2. RuntimeWarning:U gebruikt de worker met superuser-privileges:dit wordt absoluut niet aanbevolen

  3. Stream van een mongodb-cursor naar Express-reactie in node.js

  4. Ember-gegevens hiërarchie op meerdere niveaus met ingesloten altijd