如何更新集合上的TTL?

时间:2015-03-09 10:35:13

标签: javascript node.js mongodb mongodb-query mongojs

使用NodeJS + MongoJS,我连接到mongo DB。

我在一个集合上设置了一个TTL:

myCollection.createIndex({createdAt: 1}, {expireAfterSeconds: 60 * 30})

现在可以更新expireAfterSeconds的值吗? 如果是这样,该集合中现有项目的政策是什么,即:他们的TTL是自动更新还是未被触及?

3 个答案:

答案 0 :(得分:5)

你实际上无法更新"索引定义。你需要的是"删除"索引然后"重新创建"它。所以先使用.dropIndex()

myCollection.dropIndex({ "createdAt": 1 },function(err,result) { });

然后使用新的间隔重新创建:

myCollection.ensureIndex(
   { "createdAt": 1 },
   { "expireAfterSeconds": 60 * 10 },
   function(err,result) { }
);

至于何时更新,mongod服务每隔60秒就会运行一个事件,您处理删除有效日期字段的任何项目(即" createdAt"在此示例中)是在"到期期限内"从服务器的当前时间开始。

因此,这意味着删除索引并重新创建它并不重要,因为现有服务器进程将在每个具有此间隔时钟上定义的索引的集合上运行相同的到期查询。

答案 1 :(得分:2)

除了上面的@Neil答案,documentation状态,

  

您无法使用HttpClient更改现有索引的createIndex()值。而是将expireAfterSeconds数据库命令与collMod集合标志结合使用。否则,要更改现有索引的选项的值,必须先删除索引并重新创建。

所以index也可以正常工作。

答案 2 :(得分:0)

发件人:https://docs.mongodb.com/manual/tutorial/expire-data/

  

您可以使用collMod命令修改现有TTL索引的expireAfterSeconds。

在此处查看Rob的答案:https://stackoverflow.com/a/30174928/6088194

罗伯的方法对我有用。我将TTL索引从几周更新为2分钟,并且一旦它们超过新的有效期,先前加载的文档就会开始从数据库中删除。