2013-02-04 38 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