In MongoDB is de $sampleRate
aggregatiepijplijnfase komt overeen met een willekeurige selectie van invoerdocumenten.
Het aantal geselecteerde documenten benadert de steekproeffrequentie uitgedrukt als een percentage van het totale aantal documenten.
De $sampleRate
operator werd geïntroduceerd in MongoDB 4.4.2.
Wanneer u $sampleRate
gebruikt , geeft u de 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
Stel dat we een verzameling hebben met de naam employees
met de volgende documenten:
{ "_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 }
We kunnen de $sample
. gebruiken stap om willekeurig een bepaald aantal documenten uit die verzameling te selecteren.
Voorbeeld:
db.employees.aggregate(
[
{
$match: { $sampleRate: 0.33 }
}
]
)
Resultaat:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 }
Door een samplefrequentie van 0.33
op te geven , hebben we aangegeven dat ongeveer een derde van de documenten moet worden geretourneerd.
Het werkelijke resultaat kan echter behoorlijk variëren, afhankelijk van het aantal documenten in de collectie. Collecties met een kleiner aantal documenten zullen behoorlijk gevarieerde resultaten hebben, terwijl grotere collecties dichter bij de verwachte uniforme willekeurige verdeling zouden moeten liggen.
Om dit te demonstreren, is hier de resultatenset die ik krijg als ik dezelfde code opnieuw uitvoer:
{ "_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 }
En nogmaals:
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 }
En nogmaals:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
Dit is een kleinere collectie, en dus variëren de resultaten behoorlijk.
Als u een exact aantal documenten wilt retourneren, gebruikt u de $sample
in plaats daarvan het podium.