mongodb数据条目过期设置
2018年08月01日 19:20:05 秦汉唐天下 阅读数:446
Mongodb自带时间过期删除的机制,其机制主要是使用Time To Live(TTL) 索引实现的
注意:以下集中情况是无法使用TTL索引的
(1)TTL索引是单字段索引,混合索引不支持TTL,并且也会忽略expireAfterSeconds属性
(2)在_id 主键上不能建立TTL索引
(3)在capped collection中不能建立TTL索引,因为MongoDB不能从capped collection中删除文档
(4)你不能使用createIndex()去更改已经存在的TTL索引的expireAfterSeconds值,如果想更改expireAfterSeconds,可以使用collMod命令,否则你只能删除索引,然后重建了
(5)你不能在已有索引的字段上再创建TTL索引了,如果你想把非TTL索引改为TTL索引,那就只能删除重建索引了
索引创建
假设过期检时间字段名为:createdAt,具体语句如下:
(1)方式一
db.test.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 3600 } )
expireAfterSeconds指定为3600秒后过期
(2)方式二
db.test.createIndex({"createdAt":1},{expireAfterSeconds:0})
此时以createdAt字段里的具体日期值为过期时间
注意:
(1)createdAt中的日期存入mongodb后为utc格式日期,但取出时会恢复为存入时的时区值,所以插入和取出时使用正常Date对像即可
(2)过期删除时,如果业务繁忙,负载有可能会比较高,建议用第二种方式定时为业务不繁忙时进行删除操作
重建索引
(1)获取所有索引
db.test.getIndexes()
(2)删除所有索引
db.test.dropIndexes()
(3)更改索引过期时间
db.runCommand({collMod:"test",index:{keyPattern:{createdAt:1},expireAfterSeconds:0}})
其它相关命令
命令行插入时间方式
db.test.insert( {"createdAt": new Date(),"logEvent": 2} )
格林威治时间转为毫秒数(java代码)
-
/**
-
* 将格林威治时间转为毫秒数
-
* 格林威治时间格式:Wed Aug 08 00:00:00 CST 2018
-
* @param time
-
* @return
-
*/
-
public static long greenwichStrToTimeMillSec(String time) {
-
try {
-
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
-
Date date = sdf.parse(time);
-
return date.getTime();
-
} catch (ParseException e) {
-
throw new Exception(ErrorCode.UNKNOWN_EXCEPTION, e.getMessage());
-
}
-
}