如何更新集合中的TTL?

5
使用NodeJS + MongoJS,我已经连接到一个MongoDB数据库。
我使用以下命令在集合上设置了TTL:
myCollection.createIndex({createdAt: 1}, {expireAfterSeconds: 60 * 30})

现在是否可以更新expireAfterSeconds的值? 如果可以,对于集合中已经存在的项目,政策是什么?即:它们的TTL是否会自动更新或保持不变?


https://docs.mongodb.com/v3.0/tutorial/modify-an-index/ - PPB
3个回答

10

除了上面@Neil的回答之外,文档指出:

你不能使用createIndex()来更改现有索引的expireAfterSeconds值。要更改现有索引选项的值,必须先删除索引并重新创建,否则请使用collMod数据库命令和index集合标志。

因此,

db.runCommand({
  "collMod": <collection>,
  "index": {
    keyPattern: <index_spec>,
    expireAfterSeconds: <seconds>
  }
})

应该也可以正常工作。


6

实际上,您不能“更新”索引定义。您需要做的是“删除”索引,然后“重新创建”它。因此,首先使用.dropIndex()

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

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

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

关于更新时间,mongod服务在每60秒的间隔内运行,处理删除任何条目的事件,其中有效日期字段(例如本例中的"createdAt")位于服务器当前时间的"过期期限"之内。
这意味着即使您删除索引并重新创建它,现有的服务器进程也将在每个具有此类索引定义的集合上以相同的到期查询运行间隔时钟。

1
这个答案是不正确的,可能会导致问题(没有索引和重建时的性能下降)。你可以更改索引 TTL,请参阅-https://docs.mongodb.com/manual/reference/command/collMod/#mongodb-collflag-index - checklist

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接