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
Ich denke, das Hauptproblem ist, dass die Sammlung über Server verteilt werden kann und Sie daher über die gesamte Sammlung iterieren müssen.
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
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%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?