Jedes Nth Element aus einer großen MongoDB Sammlung mit PHP auswählen?

9

Ich habe eine MongoDB Sammlung mit ~ 4M Elementen.

Ich möchte die X-Nummer dieser Elemente, gleichmäßig verteilt durch die gesamte Sammlung, erfassen.

Z. B. Erhalte 1000 Elemente aus der Sammlung - eins alle 4000 Zeilen.

Im Moment bekomme ich die gesamte Sammlung in einem Cursor und schreibe dann nur jedes N-te Element. Dies gibt mir, was ich brauche, aber die ursprüngliche Last der riesigen Sammlung braucht eine lange Zeit.

Gibt es einen einfachen Weg, dies zu tun? Im Augenblick ist mein erratener Ansatz, eine JS-Abfrage für eine inkrementierte Indexeigenschaft mit einem Modulus durchzuführen. Eine PHP-Implementierung davon:

db.collection.find({i:{$mod:[10000,0]}})

Aber es sieht so aus, als würde es wahrscheinlich genauso lange dauern, bis die Abfrage ausgeführt wird.

Jer

    
blprnt 12.06.2011, 17:20
quelle

6 Antworten

0

Ich denke, das Hauptproblem ist, dass die Sammlung über Server verteilt werden kann und Sie daher über die gesamte Sammlung iterieren müssen.

    
Artjom Kurapov 12.06.2011 21:02
quelle
0

Platzieren Sie das gesamte Dataset nicht in einem Cursor. Da die Reihenreihenfolge nicht wichtig ist, sammeln Sie einfach x zufällige Zeilen aus Ihrer Gesamtmenge, geben Sie diese als Ergebnis zurück und ändern Sie dann diese Datensätze

    
Ric Johnson 14.06.2011 20:26
quelle
0

Persönlich würde ich einen "Modul" -Wert entwerfen, ihn mit etwas füllen, das eine Funktion darstellt, die für die Daten repräsentativ ist - wenn also Ihre Daten in regelmäßigen Abständen über den Tag hinweg eingegeben wurden, könnten Sie einen Modul der Zeit machen nichts vorhersagbares, dann könntest du einen zufälligen Wert verwenden; mit einer Sammlung dieser Größe würde es ziemlich schnell zur gleichmäßigen Verteilung tendieren.

Ein Beispiel mit einem Zufallswert ...

%Vor%     
oodavid 15.06.2011 10:18
quelle
0

Wäre das nicht ein perfekter Anwendungsfall für einen Map Reduce Job?

    
Marko 02.11.2011 10:30
quelle
0

Eine einfache (ineffiziente) Methode ist ein Stream.

%Vor%     
y3sh 14.11.2014 21:57
quelle
-4

Wenn nur Ihre Daten in einer SQL-Datenbank wären, wie es sein sollte, ... wäre diese Frage nicht in PHP und die Antwort wäre so einfach und schnell ...

Nichts in einen Cursor zu laden, anstatt die Informationen direkt in der db zu berechnen, ist definitiv eine schlechte Idee, ist es nicht möglich, dies direkt im MongoDB-Ding zu tun?

    
Morg. 22.09.2011 11:19
quelle

Tags und Links