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:
Zwei Hauptnachteile sind, dass ich alle Daten lade - oder ich mache mehrere Abfragen.
Jeder Vorschlag sehr geschätzt
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:
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)
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> } }
In diesem Fall:
%Vor%Tags und Links javascript random mongodb restangular mlab