12

I have a collections of documents in mongodb, with the expireAfterSeconds property set on a date-type index.

For the sake of argument, the documents are set to expire after one hour.

When I update a document in this collection, which one of the following will happen?

a) The document will expire one hour after the original creation time.

b) The document will expire one hour after the update time.

c) The document will expire one hour after the indexed variable's time, whatever that may be.

d) None of the above

I think that it's c, but cannot find the reference to confirm it. Am I correct? Where is this documented?

[edit]: To clarify, the situation is that I'm storing password reset codes (that should expire.) and I want the old codes to stop working if a new code is requested. It's not very relevant though, since I can ensure the behaviour I want is always respected by simply deleting the old transaction. This question is not about my current problem, but about Mongo's behaviour.

4

2 に答える 2

18

正解はc)

この日付フィールドの内容は、削除するエントリを選択するために使用されるため、expireAfterSeconds プロパティには、BSON 日付を含むフィールドのインデックスが常に必要です。

ドキュメントを更新して有効期限をリセットする場合は、インデックス付きの日付フィールドも現在の時刻に更新します。

更新が TTL に影響を与えないようにしたい場合は、日付を更新しないでください。

ただし、expireAfterSeconds はドキュメントの即時削除を保証しないことに注意してください。削除は、毎分実行されるバックグラウンド ジョブによって行われます。このジョブは優先度が低く、現在の負荷が高い場合に MongoDB によって延期される可能性があります。そのため、ユースケースで有効期限が秒単位で正確に尊重されることが重要な場合は、アプリケーション レベルで追加のチェックを追加する必要があります。

この機能はここに文書化されています: http://docs.mongodb.org/manual/tutorial/expire-data/

于 2012-09-10T13:19:23.743 に答える
0

コレクションを期限切れにするために mongo demon プロセスに依存したくない場合は、コレクションに追加の createdOn フィールドを作成し、それを現在のタイムスタンプと比較して、そのドキュメントを使用するかどうかを決定することをお勧めします。

于 2016-03-10T18:56:46.043 に答える