MongoDB: Wie findet man 10 zufällige Dokumente in einer Sammlung von 100?

7

Ist MongoDB in der Lage, die Anzahl der zufälligen Dokumente ohne mehrere Abfragen zu finanzieren?

z.B. Ich habe auf der JS-Seite implementiert, nachdem ich das gesamte Dokument in die Sammlung geladen habe. Das ist verschwenderisch - daher wollte ich nur überprüfen, ob dies mit einer Datenbankabfrage besser gemacht werden kann.

Der Pfad, den ich auf der JS-Seite genommen habe:

  • bekomme alle Daten
  • Erstellen Sie ein Array der IDs
  • Shuffle Array von IDs (zufällige Reihenfolge)
  • Verbinden Sie das Array mit der Anzahl der erforderlichen Dokumente
  • Erstellen Sie eine Liste von Dokumenten, indem Sie sie nach der ID auswählen, die wir nach zwei vorherigen Operationen nacheinander aus der gesamten Sammlung erhalten haben

Zwei Hauptnachteile sind, dass ich alle Daten lade - oder ich mache mehrere Abfragen.

Jeder Vorschlag sehr geschätzt

    
Iladarsda 17.07.2014, 14:46
quelle

4 Antworten

8

Dies wurde vor langer Zeit beantwortet und seither hat sich MongoDB stark weiterentwickelt.

Wie bereits in einer anderen Antwort erwähnt, unterstützt MongoDB jetzt Sampling im Aggregation Framework seit der Version 3.2:

So können Sie das tun:

%Vor%

Oder:

%Vor%

Allerdings gibt es einige Warnungen über den $ -Sample-Operator:

(Stand: 6. November 2017, wobei die neueste Version 3.4 ist) = & gt; Wenn dies nicht der Fall ist:

  • $ sample ist die erste Stufe der Pipeline
  • N ist weniger als 5% der gesamten Dokumente in der Sammlung
  • Die Sammlung enthält mehr als 100 Dokumente
  

Wenn eine der obigen Bedingungen NICHT erfüllt ist, führt $ sample a aus   Collection-Scan gefolgt von einer zufälligen Sortierung, um N Dokumente auszuwählen.

Wie im letzten Beispiel mit $ match

ALTE ANTWORT

Sie könnten immer ausführen:

%Vor%

Aber die Reihenfolge wird nicht zufällig sein, und Sie werden zwei Abfragen benötigen (eine Zählung, um IHRE_KOLLEKTIONSGRÖßE zu erhalten) oder schätzen, wie groß es ist (es sind ungefähr 100 Datensätze, ungefähr 1000, ungefähr 10000 ...)

Sie können auch allen Dokumenten mit einer Zufallszahl ein Feld hinzufügen und nach dieser Nummer suchen. Der Nachteil hierbei wäre, dass Sie jedes Mal dieselben Ergebnisse erhalten, wenn Sie dieselbe Abfrage ausführen. Um das zu beheben, können Sie immer mit Limit spielen und überspringen oder sogar mit sortieren. Sie könnten diese Zufallszahlen auch jedes Mal aktualisieren, wenn Sie einen Datensatz abrufen (impliziert mehr Abfragen).

- Ich weiß nicht, ob Sie Mongoose, Mondoid oder direkt den Mongo Driver für eine bestimmte Sprache verwenden, also werde ich alles über Mongo Shell schreiben.

Damit würde Ihr Produkt-Datensatz zum Beispiel so aussehen:

%Vor%

und ich würde vorschlagen zu verwenden:

%Vor%

Dann könnten Sie tun:

%Vor%

Sie könnten dann regelmäßig ausgeführt werden, damit Sie das Feld _random_sample des Dokuments regelmäßig aktualisieren:

%Vor%

oder nur wenn Sie einige Datensätze abrufen, können Sie alle oder nur einige wenige aktualisieren (abhängig davon, wie viele Datensätze Sie abgerufen haben)

%Vor%

BEARBEITEN

Beachten Sie, dass

%Vor%

funktioniert nicht sehr gut, da alle Produkte, die Ihrer Suchanfrage entsprechen, mit derselben Zufallszahl aktualisiert werden. Der letzte Ansatz funktioniert besser (Aktualisieren einiger Dokumente beim Abrufen)

    
Enrique Fueyo 17.07.2014, 16:12
quelle
23

Seit 3.2 gibt es einen einfacheren Weg, um eine zufällige Auswahl von Dokumenten aus einer Sammlung zu erhalten:

  

$ Beispiel   Neu in Version 3.2.

     

Wählt nach dem Zufallsprinzip die angegebene Anzahl von Dokumenten aus.

     

Die $ -Sample-Stufe hat die folgende Syntax:

     

{ $sample: { size: <positive integer> } }

Quelle: MongoDB Docs

In diesem Fall:

%Vor%     
Daniel Budick 06.04.2016 09:53
quelle
2

Hier ist, was ich am Ende herausgefunden habe:

%Vor%     
Iladarsda 16.08.2014 13:03
quelle
0

überspringen hat für mich nicht geklappt. Hier ist, was ich mit abgeschlossen habe:

%Vor%

erhält ein einziges zufälliges Ergebnis, das den Kriterien entspricht.

    
Marc 30.09.2016 18:22
quelle