In MongoDB die $sample
Die Phase der Aggregationspipeline wählt zufällig die angegebene Anzahl von Dokumenten aus ihrer Eingabe aus.
Beispiel
Angenommen, wir haben eine Sammlung namens employees
mit folgenden Dokumenten:
{ "_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 }
Wir können das $sample
verwenden Schritt, um zufällig eine bestimmte Anzahl von Dokumenten aus dieser Sammlung auszuwählen.
Beispiel:
db.employees.aggregate(
[
{
$sample: { size: 3 }
}
]
)
Ergebnis:
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 }
In diesem Fall habe ich angegeben, dass die Stichprobengröße 3 ist. Wir können sehen, dass drei Dokumente in zufälliger Reihenfolge zurückgegeben wurden.
Hier ist das Ergebnis, wenn ich denselben Code erneut ausführe:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 9, "name" : "Xena", "salary" : 382000 }
Wir bekommen eine andere Auswahl an Dokumenten.
Wir können die Stichprobengröße erhöhen, indem wir die Anzahl erhöhen.
Beispiel:
db.employees.aggregate(
[
{
$sample: { size: 5 }
}
]
)
Ergebnis:
{ "_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 Dokumente nach dem Zufallsprinzip zurücksenden
Wenn die angeforderte Stichprobengröße mit der Anzahl der Dokumente in der Sammlung übereinstimmt oder größer als diese ist, werden alle Dokumente in zufälliger Reihenfolge zurückgegeben.
Beispiel:
db.employees.aggregate(
[
{
$sample: { size: 100 }
}
]
)
Ergebnis:
{ "_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 }
Wie $sample
Berechnet das Ergebnis
Das $sample
stage verwendet eine von zwei Methoden, um das Ergebnis zu erzeugen. Die tatsächlich verwendete Methode hängt vom Szenario ab.
Die folgende Tabelle zeigt, welche Methode für jedes Szenario verwendet wird.
Szenario | Methode zur Erstellung der Ergebnisse |
---|---|
Alle folgenden Bedingungen sind erfüllt: – $sample ist die erste Stufe der Pipeline – Die angegebene Stichprobengröße beträgt weniger als 5 % der gesamten Dokumente in der Sammlung – Die Sammlung umfasst mehr als 100 Dokumente | $sample verwendet einen pseudozufälligen Cursor, um Dokumente auszuwählen. |
Alle oben genannten Bedingungen sind nicht getroffen. | $sample führt einen Sammlungsscan durch, gefolgt von einer zufälligen Sortierung, um die angegebene Anzahl von Dokumenten auszuwählen. |
Duplikate
Die MongoDB-Dokumentation warnt davor, dass $sample
kann dasselbe Dokument mehr als einmal in seiner Ergebnismenge ausgeben.