MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

3 Möglichkeiten, eine zufällige Auswahl von Dokumenten aus einer MongoDB-Sammlung zurückzugeben

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 Betreiber

Der $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 Betreiber

Eingefü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 zwischen 0 an und 1 . 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 }