12

我在 mongodb 中有一组文档,expireAfterSeconds属性设置在日期类型索引上。

为了争论起见,这些文件被设置为一小时后到期。

当我更新此集合中的文档时,会发生以下哪一项?

a)文档将在原始创建时间后一小时过期。

b)文件将在更新时间后一小时过期。

c)文档将在索引变量的时间后一小时过期,无论是什么时间。

d)以上都不是

我认为它是c,但找不到确认它的参考。我对么?这是在哪里记录的?

[编辑]:澄清一下,情况是我正在存储密码重置代码(应该过期。)如果请求新代码,我希望旧代码停止工作。但这并不是很相关,因为我可以通过简单地删除旧事务来确保始终尊重我想要的行为。这个问题不是关于我当前的问题,而是关于 Mongo 的行为。

4

2 回答 2

18

正确答案是c)

expireAfterSeconds 属性始终需要包含 BSON 日期的字段的索引,因为此日期字段的内容用于选择要删除的条目。

当您想要更新文档以重置生存时间时,还将索引日期字段更新为当前时间。

当您希望更新不影响 TTL 时,请不要更新日期。

但是,请记住 expireAfterSeconds 并不能保证立即删除文档。删除由每分钟运行的后台作业完成。该作业是低优先级的,可以在当前负载高时被 MongoDB 推迟。因此,当过期时间精确到秒对您的用例很重要时,您应该在应用程序级别添加额外的检查。

此功能记录在这里:http ://docs.mongodb.org/manual/tutorial/expire-data/

于 2012-09-10T13:19:23.743 回答
0

如果您不想依赖 mongo 恶魔进程来使集合过期,那么最好在集合上创建一个额外的 createdOn 字段并将其与当前时间戳进行比较以决定是否使用该文档。

于 2016-03-10T18:56:46.043 回答