12

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

4

2 回答 2

20

有两种方法可以设置TTL 集合的到期日期

  1. 在全局级别,创建索引时
  2. 每个文档,作为文档中的一个字段

这些模式是专有的。

全球到期

如果您希望所有文档在创建 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 })
于 2014-01-31T20:21:51.553 回答
5

我一直在考虑使用内置TTL功能,但是动态更改过期日期并不容易

这很奇怪。为什么会有问题?如果您的文档有一个字段Expires,您可以随时更新该字段以动态延长或缩短文档的生命周期。

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

  1. 你必须编码、记录和维护它
  2. 删除大量文档可能会很昂贵,并且会导致大量重新排序。更频繁地运行净化可能会有所帮助

最小化索引的数量是一件好事,但问题是它是否真的值得付出努力。这个问题只有你能给出答案。我的建议是:如果可能的话,从已经存在的东西开始,当且仅当你真的需要时才想出更好的东西。

于 2013-10-01T08:51:43.997 回答