有沒有辦法爲文檔設置生存時間,然後將其銷燬。我想創建每個會話都是臨時用戶的訪客用戶,因此一個星期後文檔會自動刪除。Mongoid文檔生存時間
4
A
回答
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
首先,您應該將include Mongoid::Timestamps
添加到您的模型中。
其次你應該添加一個cron作業或某種形式的工人將運行(如果你不想或者您可以使用此寶石https://github.com/daddye/foreverb)
然後你就可以輕鬆地設置了一個檢查寶石看到
if model.created_at > 1.week.ago
model.destroy
end
相關問題
- 1. 保存嵌入文檔mongoid
- 2. 命名空間內的Mongoid文檔
- 3. Mongoid在rails中不保存文檔
- 4. mongoid嵌入文檔
- 5. Mongoid隨機文檔
- 6. Mongoid嵌入式文檔中的時間戳
- 7. 使用mongoid保存/銷燬文檔時忽略驗證
- 8. 只有在使用Mongoid嵌入文檔時才保留文檔?
- 9. 作爲數字存儲時間戳Mongoid
- 10. Mongoid通過嵌入文檔
- 11. 的form_for爲Mongoid ::文檔子
- 12. 用mongoId獲取「previous」文檔
- 13. 生成存檔時出錯
- 14. 如何檢查mongoid中的文檔中是否存在嵌入式文檔?
- 15. 在Mongo集合之間移動文檔(通過Mongoid)
- 16. Mongoid時間戳索引
- 17. Mongoid,與嵌入式文檔與時間戳和版本控制混淆?
- 18. Mongoid命名範圍比較同一文檔中的兩個時間字段
- 19. 生存分析中的生存時間
- 20. mongoid即使目前+輪胎+ mongoid也沒有找到文檔
- 21. Rails Mongoid:查詢嵌入式文檔並訪問Mongoid標準
- 22. 儘管自定義驗證無效,但Mongoid保存文檔
- 23. 爲什麼這個Mongoid文檔只能保存一個孩子?
- 24. 保存在Mongoid中替換嵌入文檔
- 25. Mongoid embeds_many:推送文檔而不保存以保留髒狀態
- 26. Rails和mongoid:保存/更新引用文檔時,在引用的文檔上調用驗證?
- 27. 存儲時區與Mongoid
- 28. Mongoid - 如何使用嵌入式文檔創建文檔?
- 29. 將文檔直接嵌入到具有mongoid的文檔中
- 30. 包含引用文檔ID的Mongoid查詢文檔
好的,但我只需要TTL只在一系列的文件在我的情況下來賓用戶。 user.role = guest,我不認爲這個功能那麼做 –
我沒有意識到你只需要過期集合的一個子集。這是一個想法:因爲索引需要日期/時間值,所以對於非訪客用戶,只需將索引字段設置爲「nil」,並且它們永遠不會過期。在這種情況下,我會創建一個特殊的日期/時間字段(而不是使用標準'created_at')。 – wyattisimo
我更新了我的答案,以包含僅限客人角色過期的示例。 – wyattisimo