mongodb的ttl系列有什么好处? vs清除管家的数据?

时间:2013-10-01 01:49:41

标签: mongodb ttl

我一直在考虑使用TTL中的构建功能,但动态更改到期日期并不容易。 由于mongodb正在使用后台任务清除数据。根据“> Certain_date”编码我自己的清除功能是否有任何缺点,并且每天运行一次? 这样,我可以动态更改TTL值,并且此日期字段不必是单个索引。我可以将此字段重用为复杂索引的一部分,以最大限度地减少索引数。

2 个答案:

答案 0 :(得分:19)

有两种方法可以设置expiration date on a TTL collection

  1. 在全球范围内,创建索引时
  2. 每个文档,作为文档中的字段
  3. 这些模式是独家的。

    全球到期

    如果您希望所有文档在创建后3个月过期,请通过创建索引来使用第一个模式,如下所示:

    db.events.ensureIndex({ "createdAt": 1 }, { expireAfterSeconds: 7776000 })
    

    如果您以后决定将到期时间更改为“4个月”,则只需使用collMod命令更新expireAfterSeconds值:

    db.runCommand({"collMod" : "events" , "index" : { "keyPattern" : {"createdAt" : 1 } , "expireAfterSeconds" : 10368000 } })
    

    每个文件到期

    如果您希望每个文档都有自己的到期日期,请将特定日期保存在“expiresAt”之类的字段中,然后使用以下内容对您的集合编制索引:

    db.events.ensureIndex({ "expiresAt": 1 }, { expireAfterSeconds: 0 })
    

答案 1 :(得分:5)

  

我一直在考虑使用TTL中的构建功能,但动态更改到期日期并不容易

这很奇怪。为什么会出现问题?如果您的文档包含字段Expires,则可以随时更新该字段以动态延长或缩短文档的使用期限。

  

根据“> certain_date”编码我自己的清除功能是否有任何缺点,并且每天运行一次?

  1. 您必须编码,记录和维护它
  2. 删除大量文档可能会很昂贵并导致大量重新订购。这可能有助于更频繁地进行清除
  3. 最小化索引的数量是一件好事,但问题是它是否真的值得付出努力。只有你能回答这个问题。我的建议是:从已经存在的东西开始,如果有可能的话,并且只有当你真的需要时才会提出更好的东西。