如何更新集合的 TTL?

How to update the TTL on a collection?

使用 NodeJS + MongoJS,我连接到 mongo 数据库。

我为一个集合设置了 TTL:

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

现在可以更新 expireAfterSeconds 的值吗? 如果是这样,集合中已有项目的政策是什么,即:它们的 TTL 是自动更新还是保持不变?

实际上您不能 "update" 索引定义。您在这里需要的是 "delete" 索引,然后是 "re-create" 它。所以先用.dropIndex()

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

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

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

至于何时更新,mongod 服务 运行 每隔 60 秒处理一次事件,删除有效日期字段(即 "createdAt" 在这个例子中 ) 在服务器当前时间的 "expiry period" 之内。

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

除了上面的@Neil 回答,documentation 指出,

You cannot use createIndex() to change the value of expireAfterSeconds of an existing index. Instead use the collMod database command in conjunction with the index collection flag. Otherwise, to change the value of the option of an existing index, you must drop the index first and recreate.

所以

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

应该也能正常工作。

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

You can modify the expireAfterSeconds of an existing TTL index using the collMod command.

在这里查看 Rob 的回答:

Rob 的方法对我有用。我将 TTL 索引从数周更新为 2 分钟,之前加载的文档一旦超过新的有效期就开始从数据库中删除。

编辑: 请注意,如果为 Mongo 启用身份验证,则 'collMod' command requires dbAdmin or adAminAnyDatabase 权限