Wenn Sie eine kleine Stichprobe von zufälligen Dokumenten aus einer Sammlung zurückgeben müssen, sind hier drei Ansätze, die Sie mit der Aggregationspipeline ausprobieren können.
Die $sample
Stufe
Das $sample
Die Phase der Aggregationspipeline ist speziell für die zufällige Auswahl einer bestimmten Anzahl von Dokumenten konzipiert.
Wenn Sie $sample
verwenden , geben Sie die Anzahl der Dokumente an, die Sie in einer size
zurückgeben möchten Feld.
Angenommen, wir haben die folgende Sammlung namens pets
:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :„Hund“, „Gewicht“ :10 }{ „_id“ :3, „Name“ :„Miau“, „Typ“ :„Katze“, „Gewicht“ :7 }{ „_id“ :4, „Name“ :„Scratch“, „type“ :„Cat“, „weight“ :8 }{ „_id“ :5, „name“ :„Bruce“, „type“ :„Bat“, „weight“ :3 }{ „ _id“ :6, „name“ :„Hop“, „type“ :„Kangaroo“, „weight“ :130 }{ „_id“ :7, „name“ :„Punch“, „type“ :„Gorilla“, „Gewicht“ :300 }{ „_id“ :8, „Name“ :„Snap“, „Typ“ :„Krokodil“, „Gewicht“ :400 }{ „_id“ :9, „Name“ :„Flutter“, "Typ":"Kolibri", "Gewicht":1 }
Wir können $sample
verwenden um eine zufällige Stichprobe dieser Dokumente wie folgt zu entnehmen:
db.pets.aggregate( [ { $sample:{ size:3 } } ])
Ergebnis:
{ „_id“ :1, „name“ :„Wag“, „typ“ :„Hund“, „gewicht“ :20 }{ „_id“ :5, „name“ :„Bruce“, „typ“ :„Fledermaus“, „Gewicht“ :3 }{ „_id“ :3, „Name“ :„Miau“, „Typ“ :„Katze“, „Gewicht“ :7 }
In diesem Fall habe ich { size: 3 }
angegeben die drei Dokumente zurückgegeben.
Hier wird wieder eine andere Stichprobengröße verwendet:
db.pets.aggregate(
[
{
$sample: { size: 5 }
}
]
)
Ergebnis:
{ "_id" :6, "name" :"Hop", "type" :"Kangaroo", "weight" :130 }{ "_id" :5, "name" :"Bruce", "type" :„Bat“, „weight“ :3 }{ „_id“ :8, „name“ :„Snap“, „type“ :„Crocodile“, „weight“ :400 }{ „_id“ :7, „name“ :„Punch“, „type“ :„Gorilla“, „weight“ :300 }{ „_id“ :4, „name“ :„Scratch“, „type“ :„Cat“, „weight“ :8 }Das
$sample
stage funktioniert auf zwei Arten, abhängig von der Anzahl der Dokumente in der Sammlung, der Stichprobengröße im Verhältnis zur Anzahl der Dokumente in der Sammlung und ihrer Position in der Pipeline. Siehe MongoDB$sample
für eine Erklärung, wie es funktioniert.Es ist auch möglich, dass die
$sample
stage könnte dasselbe Dokument mehr als einmal in seiner Ergebnismenge zurückgeben.Der
$rand
BetreiberDer
$rand
-Operator wurde in MongoDB 4.4.2 eingeführt und dient dazu, bei jedem Aufruf eine zufällige Gleitkommazahl zwischen 0 und 1 zurückzugeben.Daher können wir es im
$match
verwenden stage in Verbindung mit anderen Operatoren wie$expr
und$lt
um eine zufällige Auswahl von Dokumenten zurückzugeben.Beispiel:
db.pets.aggregate( [ { $match: { $expr: { $lt: [ 0.5, { $rand: {} } ] } } } ] )
Ergebnis:
{ "_id" :3, "name" :"Miau", "type" :"Cat", "weight" :7 }{ "_id" :4, "name" :"Scratch", "type" :„Cat“, „weight“ :8 }{ „_id“ :6, „name“ :„Hop“, „type“ :„Kangaroo“, „weight“ :130 }{ „_id“ :9, „name“ :„Flattern“, „Typ“ :„Kolibri“, „Gewicht“ :1 }Die Ergebnismenge dieses Ansatzes unterscheidet sich von
$sample
Ansatz, da er keine feste Anzahl von Dokumenten zurückgibt. Die Anzahl der bei diesem Ansatz zurückgegebenen Dokumente kann variieren.Folgendes passiert beispielsweise, wenn ich denselben Code mehrmals ausführe.
Ergebnissatz 2:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :7, "name" :"Punch", "type" :„Gorilla“, „Gewicht“ :300 }{ „_id“ :8, „Name“ :„Snap“, „Typ“ :„Krokodil“, „Gewicht“ :400 }Ergebnissatz 3:
{ "_id" :2, "name" :"Bark", "type" :"Hund", "weight" :10 }{ "_id" :4, "name" :"Scratch", "type" :„Katze“, „Gewicht“ :8 }{ „_id“ :9, „Name“ :„Flutter“, „Typ“ :„Kolibri“, „Gewicht“ :1 }Ergebnissatz 4:
{ „_id“ :1, „name“ :„Wag“, „typ“ :„Hund“, „gewicht“ :20 }{ „_id“ :3, „name“ :„Miau“, „typ“ :„Cat“, „weight“ :7 }{ „_id“ :6, „name“ :„Hop“, „type“ :„Kangaroo“, „weight“ :130 }{ „_id“ :8, „name“ :„Snap“, „Typ“ :„Krokodil“, „Gewicht“ :400 }Ergebnissatz 5:
{ „_id“ :1, „name“ :„Wag“, „type“ :„Hund“, „weight“ :20 }{ „_id“ :4, „name“ :„Scratch“, „type“ :„Cat“, „weight“ :8 }{ „_id“ :7, „name“ :„Punch“, „type“ :„Gorilla“, „weight“ :300 }{ „_id“ :8, „name“ :„Snap“, „type“ :„Crocodile“, „weight“ :400 }{ „_id“ :9, „name“ :„Flutter“, „type“ :„Hummingbird“, „weight“ :1 }Die
$sampleRate
BetreiberEingeführt in MongoDB 4.4.2, der
$sampleRate
-Operator bietet eine präzisere Möglichkeit, dasselbe wie im vorherigen Beispiel zu tun.Wenn Sie
$sampleRate
verwenden , geben Sie eine Abtastrate als Fließkommazahl zwischen0
an und1
. Der Auswahlprozess verwendet eine gleichmäßige Zufallsverteilung, und die von Ihnen angegebene Stichprobenrate stellt die Wahrscheinlichkeit dar, dass ein bestimmtes Dokument ausgewählt wird, wenn es die Pipeline durchläuft.Beispiel:
db.pets.aggregate( [ { $match: { $sampleRate: 0.5 } } ] )
Ergebnis:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :„Hund“, „Gewicht“ :10 }{ „_id“ :5, „Name“ :„Bruce“, „Typ“ :„Fledermaus“, „Gewicht“ :3 }{ „_id“ :6, „Name“ :„Hop“, „type“ :„Kangaroo“, „weight“ :130 }{ „_id“ :7, „name“ :„Punch“, „type“ :„Gorilla“, „weight“ :300 }{ „ _id“ :8, „name“ :„Snap“, „type“ :„Crocodile“, „weight“ :400 }Und erneut ausführen:
{ "_id" :3, "name" :"Miau", "type" :"Cat", "weight" :7 }{ "_id" :4, "name" :"Scratch", "type" :„Cat“, „weight“ :8 }{ „_id“ :7, „name“ :„Punch“, „type“ :„Gorilla“, „weight“ :300 }{ „_id“ :8, „name“ :„Snap“, „type“ :„Crocodile“, „weight“ :400 }{ „_id“ :9, „name“ :„Flutter“, „type“ :„Hummingbird“, „weight“ :1 }Und nochmal:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :„Hund“, „Gewicht“ :10 }{ „_id“ :3, „Name“ :„Miau“, „Typ“ :„Katze“, „Gewicht“ :7 }{ „_id“ :8, „Name“ :„Snap“, „Typ“ :„Krokodil“, „Gewicht“ :400 }