【问题标题】:Deleting a document in monogid after sometime一段时间后删除monogid中的文档
【发布时间】:2013-11-20 05:40:55
【问题描述】:

我正在使用 mongoid 开发 Rails 应用程序。这是模型之一(收藏):

class Document
 include Mongoid::Document
 include Mongoid::Timestamps
 include Mongoid::Paperclip

 field :time, type: Time
 field :radius, type: Float
 attr_accessible :time,:radius
end

时间字段包含删除模型的实际时间。我该怎么做,一个想法是我必须写一个脚本把它放在 cron 工作中。但我不想创建一个 cron 作业。有没有其他方法可以自动化这个或我可以定义的 Rails 模型中的任何方法或仅内置到 Rails 中的东西。我肯定错过了什么。

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

    您可以通过使用TTL indexes 来实现此目的而无需 cron。

    您需要做的就是在该字段上放置一个 TTL 索引:

    db.log.events.ensureIndex( { "time": 1 }, { expireAfterSeconds: 3600 } ) // this means that it will expire in 1 hour after the time in the field `time`
    

    【讨论】:

    • 实际上我认为不需要使用索引。我只是想在制作文档时这样做,我想在时间(以小时为单位的字段)之后添加它应该被删除。任何想法我应该使用的 mongoid 命令。
    • @DeependerSingla 如果没有索引,您将无法实现这一目标。确切的索引在一段时间后为您提供了这种删除功能。并且没有执行此操作的 mongoid 命令。
    【解决方案2】:

    您可以使用delayed_job gem:https://github.com/collectiveidea/delayed_job

    document.delay(run_at: time).destroy
    

    【讨论】:

    • Nice Suggestion 会试试的。目前我每次进行搜索时都会启动一个方法,该方法检查文档是否仍然需要存在,如果不存在则删除它。所以它不会进入搜索范围。
    【解决方案3】:

    在你的模型中添加这一行来实现它:

    index({:time => 1}, {background: true, expire_after_seconds: 0})
    

    如果您的收藏很大,也可以在后台进行索引。您需要一个索引,因为要找到要删除的项目,您不需要搜索整个集合。

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 2020-04-21
      相关资源
      最近更新 更多