如何更新集合上的 TTL
How to update the TTL on a collection?
使用 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权限
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- Meteor-将选定窗体中的对象添加到集合中
- 主干集合重置和解析
- 使用数据上的角度更改设置集合的第一个元素的动画
- 为集合分配大量的模型弹药
- 如何使用backbone.js从集合中获取模型名称
- Lodash从集合创建集合
- 2个backbone.js集合,具有相同的模型,但排序顺序不同
- 如何合并不同集合的游标并按日期排序
- 将当前用户的 ID 推送到 meteorjs 中集合/文档的内部数组
- 使用它更新集合中的嵌套数组's索引
- 主干-从模板中迭代的集合中获取特定的模型
- 微风得到的是实体而不是对象的集合
- Meteor:插入集合后如何执行JS
- 如何使用javascript var引用Mongo DB集合's字段
- MongoDB-通过比较集合和对象的数组来返回现有字段的数组
- 如何组织用户系统的Mongo集合
- 在Meteor中插入集合时出错
- Meteor:Tracker.autorun/observerChanges&集合未按预期工作
- 如何更新集合上的 TTL