当前位置: 移动技术网 > IT编程>数据库>MongoDB > MongoDB中的定时索引示例详解

MongoDB中的定时索引示例详解

2019年09月06日  | 移动技术网IT编程  | 我要评论

mongodb中存在一种索引,叫做ttl索引(time-to-live index,具有生命周期的索引),这种索引允许为每一个文档设置一个超时时间。一个文档达到预设置的老化程度后就会被删除。

数据到期对于某些类型的信息非常有用,例如机器生成的事件数据,日志和会话信息,这些信息只需要在数据库中保存有限的时间。

在createindex中指定expireafterseconds选项就可以创建一个ttl索引:

// 超时时间为24小时,默认是前台运行,可以通过background:true设置为后台模式
db.user_session.createindex({"updated":1},{expireafterseconds:60*60*24});

这样在updated字段上创建了一个ttl索引。如果一个文档的updated字段存在并且它的值是日期类型,当服务器时间比文档的updated字段的时间晚expireafterseconds秒时,文档就会被删除。

db.getcollection('user_session').insert(
 {
  _id: numberint(1),
  "updated":new date(),
   username:'lisi'
 }
);

mongodb保存时间使用的utc时间,在查询出来的结果的时候会转换为gmt时间,所以你看到保存的时间和电脑时间相差8个小时(gmt+8)
db.getcollection('user_session').find({updated:{$gt: new date("2019-07-12 14:00:00")}})  在查询的时候可以使用new date()直接进行时间的比较,new date传入的参数是gmt时间

为了防止活跃的会话被删除,可以在会话上有活动发生时将updated字段的值更新为当前时间。只要updated的时间距离当前时间达到24小时。相应的文档就会被删除。

mongodb的ttl功能依赖于mongodb中的后台线程,该线程读取索引中的日期类型值并从集合中删除过期的文档。

mongodb每分钟对ttl索引进行一次清理,所以不应该依赖以秒为单位的时间保证索引的存活状态。而且ttl索引不保证在到期时立即删除过期数据。文档到期的时间与mongodb从数据库中删除文档的时间之间可能存在延迟。由于删除过期文档的后台任务每60秒运行一次。所以,文档可能在文档到期和后台任务运行之间的期间保留在集合中。

源码在 …

mongodb不支持使用createindex来重新设置过期时间,只可以使用collmod命令修改expireafterseconds的值:

db.runcommand({collmod:"user_session",index: {name:"updated_1",expireafterseconds: 120}});

修改成功后,你会收到这样的消息(之前的过期时间是一分钟,现在修改为2分钟)

{
  "expireafterseconds_old" : 60.0,
  "expireafterseconds_new" : 120.0,
  "ok" : 1.0
}

在一个给定的集合上可以有多个ttl索引,你可以在created和updated字段分别建立ttl索引,但是不能同时使用两个字段建立复合ttl索引,也不能在同一个字段上又是创建ttl索引,又是创建普通索引,但是可以像“普通索引”一样用来优化排序和查询。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对移动技术网的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网