I MongoDB, $sampleRate
aggregeringspipelinesteget matchar ett slumpmässigt urval av indatadokument.
Antalet valda dokument approximerar samplingsfrekvensen uttryckt som en procentandel av det totala antalet dokument.
$sampleRate
operatören introducerades i MongoDB 4.4.2.
När du använder $sampleRate
, anger du samplingshastigheten som ett flyttal mellan 0
och 1
. Urvalsprocessen använder en enhetlig slumpmässig fördelning, och urvalsfrekvensen du anger representerar sannolikheten att ett visst dokument kommer att väljas när det passerar genom pipelinen.
Exempel
Anta att vi har en samling som heter employees
med följande dokument:
{ "_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 använda $sample
steg för att slumpmässigt välja ett visst antal dokument från den samlingen.
Exempel:
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 }
Genom att tillhandahålla en samplingsfrekvens på 0.33
, specificerade vi att ungefär en tredjedel av dokumenten skulle returneras.
Det faktiska resultatet kan dock variera ganska rejält, beroende på hur många dokument som finns i samlingen. Samlingar med ett mindre antal dokument kommer att få ganska varierande resultat, medan större samlingar bör ligga närmare den förväntade enhetliga slumpmässiga fördelningen.
För att demonstrera detta, här är resultatuppsättningen jag får när jag kör samma kod 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 }
Och igen:
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 }
Och än en gång:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
Detta är en mindre samling, så resultaten varierar ganska mycket.
Om du behöver ett exakt antal dokument som ska returneras, använd $sample
scenen istället.