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 }