Hvis du har brug for at returnere en lille prøve af tilfældige dokumenter fra en samling, er her tre metoder, du kan prøve ved at bruge aggregeringspipelinen.
$sample
Etape
$sample
aggregeringspipeline-stadiet er designet specifikt til tilfældigt at vælge et bestemt antal dokumenter.
Når du bruger $sample
, angiver du antallet af dokumenter, du gerne vil returnere i en size
felt.
Antag, at vi har følgende samling kaldet pets
:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Hund", "vægt" :10 }{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :4, "navn" :"Scratch", "type" :"Kat", "vægt" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Flagermus", "vægt" :3 }{ " _id" :6, "name" :"Hop", "type" :"Kænguru", "vægt" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Krokodille", "vægt" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Kolibri", "vægt" :1 }
Vi kan bruge $sample
for at tage et tilfældigt udsnit af disse dokumenter som dette:
db.pets.aggregate( [ { $sample:{ size:3 } } ])
Resultat:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "vægt" :20 }{ "_id" :5, "name" :"Bruce", "type" :"Flagermus", "vægt" :3 }{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }
I dette tilfælde specificerede jeg { size: 3 }
som returnerede tre dokumenter.
Her bruger den igen en anden prøvestørrelse:
db.pets.aggregate(
[
{
$sample: { size: 5 }
}
]
)
Resultat:
{ "_id" :6, "name" :"Hop", "type" :"Kænguru", "vægt" :130 }{ "_id" :5, "name" :"Bruce", "type" :"Flagermus", "vægt" :3 }{ "_id" :8, "name" :"Snap", "type" :"Krokodille", "vægt" :400 }{ "_id" :7, "navn" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }
$sample
fase fungerer på en af to måder, afhængigt af hvor mange dokumenter der er i samlingen, stikprøvestørrelsen i forhold til antallet af dokumenter i samlingen og dens placering i pipelinen. Se MongoDB$sample
for en forklaring på, hvordan det virker.Det er også muligt, at
$sample
fase kunne returnere det samme dokument mere end én gang i sit resultatsæt.
$rand
Operatør
$rand
operator blev introduceret i MongoDB 4.4.2, og dens formål er at returnere en tilfældig float mellem 0 og 1, hver gang den kaldes.Derfor kan vi bruge det i
$match
fase sammen med andre operatører, såsom$expr
og$lt
for at returnere en tilfældig stikprøve af dokumenter.Eksempel:
db.pets.aggregate( [ { $match: { $expr: { $lt: [ 0.5, { $rand: {} } ] } } } ] )
Resultat:
{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Kat", "vægt" :8 }{ "_id" :6, "name" :"Hop", "type" :"Kænguru", "vægt" :130 }{ "_id" :9, "navn" :"Flutter", "type" :"Kolibri", "vægt" :1 }Resultatsættet fra denne tilgang er anderledes end
$sample
tilgang, idet den ikke returnerer et fast antal dokumenter. Antallet af dokumenter, der returneres med denne tilgang, kan variere.For eksempel, her er hvad der sker, når jeg kører den samme kode flere gange.
Resultatsæt 2:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "vægt" :300 }{ "_id" :8, "name" :"Snap", "type" :"Krokodille", "vægt" :400 }Resultatsæt 3:
{ "_id" :2, "name" :"Bark", "type" :"Hund", "vægt" :10 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }Resultatsæt 4:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "vægt" :20 }{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :6, "name" :"Hop", "type" :"Kænguru", "vægt" :130 }{ "_id" :8, "navn" :"Snap", "type" :"Krokodille", "vægt" :400 }Resultatsæt 5:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "vægt" :20 }{ "_id" :4, "name" :"Scratch", "type" :"Kat", "vægt" :8 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "vægt" :300 }{ "_id" :8, "navn" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }
$sampleRate
OperatørIntroduceret i MongoDB 4.4.2,
$sampleRate
operator giver en mere kortfattet måde at gøre det samme på som i det foregående eksempel.Når du bruger
$sampleRate
, angiver du en sample rate som et flydende kommatal mellem0
og1
. Udvælgelsesprocessen bruger en ensartet tilfældig fordeling, og den stikprøvefrekvens, du angiver, repræsenterer sandsynligheden for, at et givet dokument vil blive udvalgt, når det passerer gennem pipelinen.Eksempel:
db.pets.aggregate( [ { $match: { $sampleRate: 0.5 } } ] )
Resultat:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Hund", "vægt" :10 }{ "_id" :5, "name" :"Bruce", "type" :"Flagermus", "vægt" :3 }{ "_id" :6, "navn" :"Hop", "type" :"Kænguru", "vægt" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "vægt" :300 }{ " _id" :8, "name" :"Snap", "type" :"Krokodille", "vægt" :400 }Og kør det igen:
{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Kat", "vægt" :8 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "vægt" :300 }{ "_id" :8, "navn" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }Og igen:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Hund", "vægt" :10 }{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :8, "navn" :"Snap", "type" :"Krokodille", "vægt" :400 }