2012-09-10 15 views
8

Ich habe eine Sammlung von Dokumenten in Mongodb, mit der expireAfterSeconds Eigenschaft auf einem Date-Type-Index festgelegt.Wann wird ein Mongodb-Dokument nach der Aktualisierung ablaufen?

Aus Gründen der Argumentation werden die Dokumente nach einer Stunde ablaufen.

Wenn ich ein Dokument in dieser Sammlung aktualisiere, welche der folgenden wird passieren?

a) Das Dokument wird eine Stunde nach der Zeit Original Schaffung verfallen.

b) Das Dokument läuft eine Stunde nach der Aktualisierung Zeit ab.

c) Das Dokument eine Stunde nach die indizierte Variable ist Zeit abläuft, was auch immer das sein mag.

d) Keine der oben genannten

denke ich, dass es c, aber die Referenz zur Bestätigung nicht finden kann. Hab ich recht? Wo ist das dokumentiert?

[edit]: Um zu verdeutlichen, die Situation ist, dass ich Passwort-Reset-Codes speichern (die ablaufen sollte.) Und ich möchte die alten Codes aufhören zu arbeiten, wenn ein neuer Code angefordert wird. Es ist jedoch nicht sehr relevant, da ich sicherstellen kann, dass das gewünschte Verhalten immer respektiert wird, indem einfach die alte Transaktion gelöscht wird. Bei dieser Frage geht es nicht um mein aktuelles Problem, sondern um Mongos Verhalten.

+0

Ich teste das Verhalten im Moment. – brice

+1

Die Dauer der Entfernungsvorgänge hängt von der Auslastung Ihrer mongod-Instanz ab, die Sie ausführen. Können Sie die Situation, die Sie gerade haben, erläutern? –

+1

Siehe aktualisierte Antwort. Meine derzeitige Situation ist jedoch ziemlich irrelevant. Ich bin mir bewusst, dass die Entfernung Zeit braucht und der genaue Zeitpunkt hängt von der Belastung ab. – brice

Antwort

15

Die richtige Antwort ist c)

Die expireAfterSeconds Eigenschaft erfordert immer einen Index auf einem Feld, das ein BSON Datum enthält, weil der Inhalt dieses Datumsfeldes verwendet wird, Einträge zum Entfernen auszuwählen.

Wenn Sie ein Dokument aktualisieren möchten, um die Lebensdauer zurückzusetzen, aktualisieren Sie auch das indizierte Datumsfeld auf die aktuelle Uhrzeit.

Wenn Sie möchten, dass ein Update die TTL nicht beeinflusst, aktualisieren Sie das Datum einfach nicht.

Beachten Sie jedoch, dass expireAfterSeconds keine sofortige Löschung des Dokuments garantiert. Die Löschungen werden von einem Hintergrundjob ausgeführt, der jede Minute ausgeführt wird. Dieser Job hat eine niedrige Priorität und kann von MongoDB verschoben werden, wenn die aktuelle Auslastung hoch ist. Wenn es also für Ihren Anwendungsfall wichtig ist, dass die Ablaufzeiten genau eingehalten werden, sollten Sie eine zusätzliche Überprüfung auf der Anwendungsebene hinzufügen.

Diese Funktion wird hier dokumentiert: http://docs.mongodb.org/manual/tutorial/expire-data/

+0

Danke Philipp. Es ist, was ich dachte, aber ich fand die Dokumentation nicht wirklich explizit. – brice

+0

Große Antwort - vollständig, prägnant. – Ross

0

Wenn Sie wollen Mongo Dämon-Prozess nicht verlassen sich auf die Sammlung für auslaufende, dann besser ein zusätzliches CreatedOn Feld auf Sammlung erstellen und mit dem aktuellen Zeitstempel vergleichen Entscheiden Sie, ob dieses Dokument verwendet werden soll oder nicht.

+0

Dies steht nicht im Zusammenhang mit der Funktionsweise von MongoDB und erfordert eine externe Verarbeitung (die außerhalb des Umfangs der ursprünglichen Frage liegt). –