Wie bekomme ich ein einzelnes Dokument aus 1 Milliarde Dokumenten in mongoDB mit Python? [Duplikat]

8

Ich möchte ein einzelnes zufälliges Dokument aus der MongoDB-Sammlung. Jetzt enthält meine mongoDB-Sammlung mehr als 1 Milliarde Sammlungen. Wie bekomme ich ein zufälliges Dokument aus dieser Sammlung?

    
Hitul Mistry 23.11.2012, 07:22
quelle

5 Antworten

6

Fügen Sie Ihrer Sammlung eine zusätzliche Spalte mit dem Namen random hinzu und legen Sie fest, dass der Wert zwischen 0 und 1 liegt. Sie können in dieser Spalte für jeden Datensatz über [random.random() for _ in range(0, 10)] zufällige Fließkommazahlen zwischen 0 und 1 zuweisen.

Dann: -

%Vor%

MongoDB wird seine native Implementierung zu gegebener Zeit haben. Filed-Funktion hier - Ссылка

Zum Zeitpunkt des Schreibens noch nicht implementiert.

    
Calvin Cheng 23.11.2012, 07:32
quelle
21

Ich habe nie mit MongoDB aus Python gearbeitet, aber es gibt eine allgemeine Lösung für Ihr Problem. Hier ist ein MongoDB-Shell-Skript zum Erhalten eines einzelnen zufälligen Dokuments:

%Vor%

condition hier ist eine MongoDB-Abfrage. Wenn Sie eine gesamte Sammlung abfragen möchten, verwenden Sie query = null .

Es ist eine allgemeine Lösung, also funktioniert es mit jedem MongoDB-Treiber.

Aktualisieren

Ich habe einen Benchmark durchgeführt, um mehrere Implementierungen zu testen. Zuerst habe ich eine Testkollektion mit 5567249 Dokumenten mit dem indizierten Zufallsfeld rnd erstellt.

Ich habe drei Methoden gewählt, um miteinander zu vergleichen:

Erste Methode:

%Vor%

Zweite Methode:

%Vor%

Dritte Methode:

%Vor%

Ich habe jede Methode zehnmal durchlaufen und habe ihre durchschnittliche Rechenzeit erreicht:

%Vor%

Dieser Benchmark zeigt, dass meine Lösung nicht die schnellste ist.

Aber die dritte Lösung ist auch keine gute, denn sie findet das erste Element in der Datenbank (sortiert in natürliche Ordnung ) mit rnd > random() . Also, seine Ausgabe ist nicht wirklich zufällig.

Ich denke, dass die zweite Methode die beste für den häufigen Gebrauch ist. Aber es hat einen Defekt: Es erfordert die Änderung der gesamten Datenbank und die Sicherstellung eines zusätzlichen Index.

    
Leonid Beschastny 23.11.2012 07:30
quelle
5

Seit MongoDB 3.2 kann dies mit aggregate function mit $sample operator geschehen, wie in docs . Es ist super schnell. Der folgende Code wird nach dem Zufallsprinzip 20 Dokumente aus der Sammlung auswählen.

%Vor%

Wenn Sie zufällige Dokumente mit bestimmten Kriterien auswählen müssen, können Sie sie mit $match opperator

verwenden %Vor%

Vorsicht vor der Bestellung! Wenn ich in meiner kleinen Datenbank nach 100k Dokumenten suche, dauert dieser Befehl 15ms, und wenn Sie die Reihenfolge wechseln, sind es 1750ms (mehr als 100x mal langsamer). Der Grund liegt natürlich auf der Hand. Außerdem erhalten Sie mit dieser Reihenfolge eine Teilmenge dieser 20 zufälligen Dokumente ...

    
kotrfa 27.04.2016 08:32
quelle
2

Auf eine performante Art und Weise? Es ist schwer, gelinde gesagt, ohne Ihre Daten zu ändern.

Stellen Sie sich vor, Sie versuchen einen Rand () von 1.000.000 aus 1b Dokumenten zu bekommen. Das wird langsam, sehr langsam. Dies liegt daran, dass MongoDB Indizes beim Überspringen nicht effektiv nutzt.

Wie @Calvin sagte, MongoDB hat eine Feature-Anfrage, um zufällige Dokumente zu erhalten, aber es ist noch nicht implementiert.

Am leistungsfähigsten ist dies, wenn Sie dies regelmäßig tun, indem Sie Ihren Datensätzen eine automatisch inkrementierende ID hinzufügen: Ссылка und verwenden Sie das zu rand() auf.

Bearbeiten

Um zu klären; Wenn Sie die automatisch inkrementierende ID verwenden, müssen Sie zunächst eine Abfrage durchführen (es sei denn, Sie behalten den Überblick), um den höchsten Wert des Feldes zu erhalten. Sie können entweder die Gegensammlung oder die Sammlung selbst abfragen und umgekehrt ( sort({field:-1}) ) und limit(1) sortieren, um den höchsten Wert für rand() zu erhalten.

Sie müssen auch Änderungen in den Daten berücksichtigen, was bedeutet, dass Sie tatsächlich $gte dieser zufälligen Position möchten.

Meine Idee kann mehr hier erklärt werden: php mongodb finden nter Eintrag in Sammlung

    
Sammaye 23.11.2012 08:14
quelle
1

Wenn Ihre Objekte eine ID haben, können Sie etwas wie

tun %Vor%     
Errol Fitzgerald 23.11.2012 07:28
quelle

Tags und Links