I MongoDB, $sample
aggregeringspipeline-steget väljer slumpmässigt det angivna antalet dokument från sin inmatning.
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(
[
{
$sample: { size: 3 }
}
]
)
Resultat:
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 }
I det här fallet specificerade jag att urvalsstorleken är 3. Vi kan se att tre dokument returnerades i slumpmässig ordning.
Här är resultatet om när jag kör samma kod igen:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 9, "name" : "Xena", "salary" : 382000 }
Vi får ett annat urval av dokument.
Vi kan öka urvalsstorleken genom att öka antalet.
Exempel:
db.employees.aggregate(
[
{
$sample: { size: 5 }
}
]
)
Resultat:
{ "_id" : 9, "name" : "Xena", "salary" : 382000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Christopher", "salary" : 45000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Returnera alla dokument slumpmässigt
Om den begärda urvalsstorleken matchar, eller är större än antalet dokument i samlingen, returneras alla dokument i slumpmässig ordning.
Exempel:
db.employees.aggregate(
[
{
$sample: { size: 100 }
}
]
)
Resultat:
{ "_id" : 4, "name" : "Christopher", "salary" : 45000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 9, "name" : "Xena", "salary" : 382000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 1, "name" : "Bob", "salary" : 55000 }
Hur $sample
Beräknar resultatet
$sample
stage använder en av två metoder för att ta fram resultatet. Den faktiska metoden som används beror på scenariot.
Följande tabell visar vilken metod som används för varje scenario.
Scenario | Metod som används för att producera resultaten |
---|---|
Alla följande villkor är uppfyllda: – $sample är det första steget i pipelinen – Den angivna provstorleken är mindre än 5 % av de totala dokumenten i samlingen – Samlingen innehåller mer än 100 dokument | $sample använder en pseudo-slumpvis markör för att välja dokument. |
Alla ovanstående villkor är inte träffade. | $sample utför en samlingsskanning följt av en slumpmässig sortering för att välja det angivna antalet dokument. |
Dubbletter
MongoDB-dokumentationen varnar för att $sample
kan skriva ut samma dokument mer än en gång i dess resultatuppsättning.