我在mongodb中有一组文档,在日期类型索引上设置了expireAfterSeconds
属性。
为了论证,文件将在一小时后过期。
当我更新此集合中的文档时,会发生以下哪种情况?
a)该文档将在原始创建时间后一小时到期。
b)文档将在更新时间后一小时到期。
c)该文件将在索引变量的时间后一小时到期,无论可能是什么。
d)以上都不是
我认为它是 c ,但无法找到确认它的引用。我对么?这记录在哪里?
[edit]:为了澄清,情况是我正在存储密码重置代码(应该过期。)并且我希望旧代码在请求新代码时停止工作。但这并不是很相关,因为我可以通过简单地删除旧事务来确保我想要的行为始终受到尊重。这个问题不是关于我当前的问题,而是关于Mongo的行为。
答案 0 :(得分:16)
正确答案是 c)
expireAfterSeconds属性始终需要包含BSON日期的字段的索引,因为此日期字段的内容用于选择要删除的条目。
如果您想要更新文档以重置生存时间,还可以将索引日期字段更新为当前时间。
如果您希望更新不影响TTL,请不要更新日期。
但是,请记住,expireAfterSeconds不保证立即删除文档。删除是由每分钟运行的后台作业完成的。此作业是低优先级的,当当前负载很高时可以被MongoDB推迟。因此,当对于您的用例而言,将到期时间准确地尊重到第二次时,您应该在应用程序级别添加额外的检查。
此功能记录在此处:http://docs.mongodb.org/manual/tutorial/expire-data/
答案 1 :(得分:0)
如果您不想依赖mongo demon进程来过期集合,那么最好在集合上创建一个额外的createdOn字段,并将其与当前时间戳进行比较,以决定是否使用该文档。