I MongoDB er $sampleRate
aggregeringspipelinestadiet matcher et tilfældigt udvalg af inputdokumenter.
Antallet af valgte dokumenter tilnærmer sig stikprøvefrekvensen udtrykt som en procentdel af det samlede antal dokumenter.
$sampleRate
operatør blev introduceret i MongoDB 4.4.2.
Når du bruger $sampleRate
, angiver du samplefrekvensen som et flydende kommatal mellem 0
og 1
. 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
Antag, at vi har en samling kaldet employees
med følgende dokumenter:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Christopher", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 } { "_id" : 9, "name" : "Xena", "salary" : 382000 }
Vi kan bruge $sample
trin for tilfældigt at vælge et bestemt antal dokumenter fra den samling.
Eksempel:
db.employees.aggregate(
[
{
$match: { $sampleRate: 0.33 }
}
]
)
Resultat:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 }
Ved at give en samplerate på 0.33
, specificerede vi, at omkring en tredjedel af dokumenterne skulle returneres.
Det faktiske resultat kan dog variere ganske betydeligt, alt efter hvor mange dokumenter der er i samlingen. Samlinger med et mindre antal dokumenter vil have ret varierede resultater, hvorimod større samlinger burde være tættere på den forventede ensartede tilfældige fordeling.
For at demonstrere dette er her det resultatsæt, jeg får, når jeg kører den samme kode igen:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Christopher", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
Og igen:
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 }
Og endnu en gang:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
Dette er en mindre samling, så resultaterne varierer ganske betydeligt.
Hvis du har brug for et nøjagtigt antal dokumenter, der skal returneres, skal du bruge $sample
scene i stedet.