2013-02-04 36 views
4

有沒有辦法爲文檔設置生存時間,然後將其銷燬。我想創建每個會話都是臨時用戶的訪客用戶,因此一個星期後文檔會自動刪除。Mongoid文檔生存時間

回答

19

的MongoDB(2.2及更高版本),實際上有一個特殊的索引類型,它允許您指定的文件上的TTL(見http://docs.mongodb.org/manual/tutorial/expire-data/)。數據庫爲你刪除過期的文件 - 不需要cron作業或任何東西。

Mongoid支持此功能如下:

index({created_at: 1}, {expire_after_seconds: 1.week}) 

created_at字段必須保存日期/時間信息。將Mongoid::Timestamps包含在您的模型中即可免費獲取。

UPDATE:

如果要到期僅部分文檔,那麼你可以創建一個只填入該子集的特殊日期/時間字段。在索引字段中沒有值或非日期/時間值的文檔永遠不會過期。例如:

# Special date/time field to base expirations on. 
field :expirable_created_at, type: Time 

# TTL index on the above field. 
index({expirable_created_at: 1}, {expire_after_seconds: 1.week}) 

# Callback to set `expirable_created_at` only for guest roles. 
before_create :set_expire, if: "role == :guest" 
def set_expire 
    self.expirable_created_at = Time.now 
    return true 
end 
+0

好的,但我只需要TTL只在一系列的文件在我的情況下來賓用戶。 user.role = guest,我不認爲這個功能那麼做 –

+0

我沒有意識到你只需要過期集合的一個子集。這是一個想法:因爲索引需要日期/時間值,所以對於非訪客用戶,只需將索引字段設置爲「nil」,並且它們永遠不會過期。在這種情況下,我會創建一個特殊的日期/時間字段(而不是使用標準'created_at')。 – wyattisimo

+0

我更新了我的答案,以包含僅限客人角色過期的示例。 – wyattisimo

0

首先,您應該將include Mongoid::Timestamps添加到您的模型中。

其次你應該添加一個cron作業或某種形式的工人將運行(如果你不想或者您可以使用此寶石https://github.com/daddye/foreverb

然後你就可以輕鬆地設置了一個檢查寶石看到

if model.created_at > 1.week.ago 
    model.destroy 
end