In MongoDB, de $sample
aggregatiepijplijnfase selecteert willekeurig het gespecificeerde aantal documenten uit de invoer.
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(
[
{
$sample: { size: 3 }
}
]
)
Resultaat:
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 }
In dit geval heb ik aangegeven dat de steekproefomvang 3 is. We kunnen zien dat drie documenten in willekeurige volgorde zijn geretourneerd.
Dit is het resultaat als ik dezelfde code opnieuw uitvoer:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 9, "name" : "Xena", "salary" : 382000 }
We krijgen een andere selectie van documenten.
We kunnen de steekproefomvang vergroten door het aantal te vergroten.
Voorbeeld:
db.employees.aggregate(
[
{
$sample: { size: 5 }
}
]
)
Resultaat:
{ "_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 }
Alle documenten willekeurig retourneren
Als de gevraagde steekproefomvang overeenkomt of groter is dan het aantal documenten in de collectie, worden alle documenten in willekeurige volgorde geretourneerd.
Voorbeeld:
db.employees.aggregate(
[
{
$sample: { size: 100 }
}
]
)
Resultaat:
{ "_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 }
Hoe $sample
Berekent het resultaat
De $sample
stage gebruikt een van de twee methoden om het resultaat te produceren. De daadwerkelijk gebruikte methode is afhankelijk van het scenario.
De volgende tabel geeft aan welke methode voor elk scenario wordt gebruikt.
Scenario | Methode gebruikt om de resultaten te produceren |
---|---|
Aan alle volgende voorwaarden is voldaan: – $sample is de eerste fase van de pijplijn – De opgegeven steekproefomvang is minder dan 5% van het totale aantal documenten in de collectie – De collectie bevat meer dan 100 documenten | $sample gebruikt een pseudo-willekeurige cursor om documenten te selecteren. |
Alle bovenstaande voorwaarden zijn niet ontmoet. | $sample voert een collectiescan uit gevolgd door een willekeurige sortering om het gespecificeerde aantal documenten te selecteren. |
Duplicaten
De MongoDB-documentatie waarschuwt dat $sample
kan hetzelfde document meer dan eens uitvoeren in de resultatenset.