【问题标题】:How to update the TTL on a collection?如何更新集合的 TTL?
【发布时间】:2015-05-10 11:36:46
【问题描述】:

使用 NodeJS + MongoJS,我可以连接到一个 mongo DB。

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

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

编辑:请注意,如果为 Mongo 启用了身份验证,则“collMod”命令需要dbAdminadAminAnyDatabase 权限

【讨论】:

    【解决方案2】:

    除了上面的@Neil 答案之外,documentation 指出,

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

    所以

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

    应该也能正常工作。

    【讨论】:

      【解决方案3】:

      您实际上无法“更新”索引定义。您需要在这里“删除”索引,然后“重新创建”它。所以先使用.dropIndex()

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

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

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

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

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

      【讨论】:

      猜你喜欢
      • 2022-12-07
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多