使用 NodeJS + MongoJS,我连接到了一个 mongo DB。
我在集合上设置了 TTL:
myCollection.createIndex({createdAt: 1}, {expireAfterSeconds: 60 * 30})
现在可以更新过期后秒的值吗?如果是这样,集合中现有项目的策略是什么,即:它们的 TTL 是自动更新还是保持不变?
除了上面的@Neil答案之外,文档指出,
不能使用
createIndex()
更改现有索引的expireAfterSeconds
值。请改用collMod
数据库命令与index
集合标志结合使用。否则,若要更改现有索引的选项值,必须先删除索引并重新创建。
所以
db.runCommand({
"collMod": <collection>,
"index": {
keyPattern: <index_spec>,
expireAfterSeconds: <seconds>
}
})
应该也可以正常工作。
您实际上无法"更新"索引定义。这里需要的是"删除"索引,然后"重新创建"它。所以先使用.dropIndex()
myCollection.dropIndex({ "createdAt": 1 },function(err,result) { });
然后使用新的间隔重新创建:
myCollection.ensureIndex(
{ "createdAt": 1 },
{ "expireAfterSeconds": 60 * 10 },
function(err,result) { }
);
至于它何时更新,mongod
服务每隔 60 秒运行一次事件,您处理一个删除事件,其中生效日期字段(即本例中的"createdAt")在服务器当前时间的"到期期限"内。
因此,这意味着是否删除索引并重新创建它并不重要,因为现有服务器进程只会在该间隔时钟上定义了此类索引的每个集合上运行相同的过期查询。
发件人: https://docs.mongodb.com/manual/tutorial/expire-data/
您可以使用 collMod 命令修改现有 TTL 索引的 expireAfterSeconds。
请看罗布的回答:https://stackoverflow.com/a/30174928/6088194
罗布的方法对我有用。我将 TTL 索引从几周更新为 2 分钟,并且一旦超过新的到期期限,以前加载的文档就会开始从数据库中删除。
编辑:请注意,如果为Mongo启用了身份验证,则"collMod"命令需要dbAdmin或adAminAnyDatabase权限