2012-04-11 5 views
4

Ich habe eine sehr große Kappe Sammlung in Mongodb. Vorausgesetzt, dass die Capped-Collection-Struktur vorhersagbar ist (d. H. Die Sortierung ist vordefiniert, der Speicher-Footprint ist vordefiniert usw.), gibt es einen besseren Weg, einen Cursor auf das LATEST-Element zu bekommen, anstatt es zu durchlaufen?überspringen Sie eine Mongo-Capped-Sammlung

Mit anderen Worten, was ich gerade mache ist, die Größe meiner Sammlung (n) zu erhalten, und dann einen Cursor erstellen, der skip = n-1 setzt, um mich am Ende der Sammlung zu setzen. Dann iteriere ich auf dem Cursor und handle alle neuen Ergänzungen der Sammlung.

Das Problem mit diesem Ansatz ist, dass meine Sammlung riesig ist. Sagen wir 11m Datensätze. Das dauert 20 Minuten zum Überspringen. Das bedeutet, dass wenn mein Cursor Daten ausgibt, seine 20 Minuten zurück sind.

+1

Ich habe die gleiche Frage. Ich versuche unser Oplog, das derzeit 180 Millionen Dokumente enthält, zu verkleinern. Der Initialisierungscursor wird wahrscheinlich einige Stunden dauern, um zu initialisieren. Und ich kann dem oplog keinen Index hinzufügen. Ich suche immer noch nach einer anständigen Option. Für den Moment sortiere ich $ natürlich: -1 mit einem großen Limit und lese den Schwanz rückwärts, bis ich das vorhergehende letzte gelesene Dokument finde, ohne einen nachziehbaren Cursor zu verwenden. – Marquez

Antwort

1

Versuchen Sie db.cappedCollection.find(). Limit (1) .sort ({$ natürlich: -1}).

+1

Ich glaube nur natürlich: 1 ist zulässig für tailable cursors –

1

Haben Sie versucht, die Sammlung zu indizieren und $ gt zu verwenden - dies sollte schneller sein, obwohl der Index einen gewissen Einfluss auf die Geschwindigkeit der Schreibvorgänge in der Sammlung haben wird.

+0

Dies wäre die richtige Lösung in fast jeder Situation, aber im Falle einer wirklich hoch aktualisierten Sammlung wird es wirklich die Leistung beeinträchtigen. In meinem Fall arbeite ich am oplog, also kann ich das nicht machen. –

Verwandte Themen