2012-09-10 70 views
8

我在mongodb中有一系列文檔,expireAfterSeconds屬性設置爲日期類型索引。更新後,mongodb文檔何時到期?

爲了論證起見,文檔設置爲在一小時後過期。

當我在這個集合中更新文檔時,會發生以下哪一種情況?

一)的文件將在創建時間到期後一小時。

b)該文件將在更新時間後一小時過期。

c)中該文件將索引變量的時間之後過期一小時任何可能。

d)無上述

我認爲這是Ç,但無法找到參考進行確認。我對麼?這在哪裏記錄?爲了澄清,情況是我正在存儲密碼重置代碼(應該過期),並且我希望舊代碼在請求新代碼時停止工作。這不是很相關,因爲我可以通過簡單地刪除舊的事務來確保我想要的行爲始終受到尊重。這個問題不是關於我目前的問題,而是關於Mongo的行爲。

+0

我正在測試此刻的行爲。 – brice

+1

刪除操作的持續時間取決於您正在運行的mongod實例的工作負載,請您詳細說明您正在使用的情況 –

+1

查看更新後的答案。但我目前的情況是非常不相干的。我知道拆除需要時間,確切的時刻將取決於負載。 – brice

回答

15

正確答案是C)

的expireAfterSeconds屬性總是需要在含有BSON日期字段上的索引,因爲這個日期欄的內容來選擇要刪除的條目。

當您想要更新文檔以重置生存時間時,還要將索引日期字段更新爲當前時間。

當您想要更新不影響TTL時,只是不更新​​日期。

但請記住,expireAfterSeconds不能保證立即刪除文檔。刪除操作由每分鐘運行的後臺作業完成。這項工作是低優先級的,可以在當前負載很高時由MongoDB推遲。因此,當您的使用情況對於第二次使用時段的準確度得到尊重至關重要時,您應該在應用程序級別添加額外的檢查。

此功能是記錄在這裏:http://docs.mongodb.org/manual/tutorial/expire-data/

+0

感謝Philipp。這是我的想法,雖然我沒有發現文檔真的很明確。 – brice

+0

偉大的答案 - 完整,簡潔。 – Ross

0

如果你不想靠蒙戈妖過程到期的集合,然後更好地收集上創建一個額外的createdOn場,並與當前的時間戳進行比較決定是否使用該文件。

+0

這與MongoDB的運行方式無關,並且需要外部處理(這不在原始問題的範圍之內)。 –