MongoDB 定时删除数据
mongo删除范围数据
mongo
删除一个范围的数据有点麻烦的,不能直接用remove
方法,只能先查出来满足条件的文档,再逐个删除。如果需要删除某个范围,特别是时间范围的数据,有两种解决办法:
- 使用
mongo TTL(Time To Live)
。 - 写个脚本,用
crontab
写个定时任务,定时连接mongo
查询满足删除条件的数据,逐条删除。
TTL
TTL Indexes
Expire Data from Collections by Setting TTL
expireAfterSeconds: xx
这种方式是设置在xx秒后自动删除文档,首先得有一个
date
类型的字段:If the indexed field in a document is not a date or an array that holds a date value(s), the document will not expire.
然后用这个
date
字段创建一个索引:
//文档将在(lastModifiedDate.addHours(1))被删除
db.log_events.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 3600 } )
- 插入一条数据:
//这条文档将在2018-01-22 15:00:00左右被删除
db.log_events.insert( {
"lastModifiedDate": new Date('Jan 22, 2018 14:00:00'),
"logEvent": 2,
"logMessage": "Success!"
} )
mongo
并不保证数据在过期时间一定被删除,可能会有一定的延迟,因为删除机制是mongo
在后台专门起一个进程,每隔60s检查一次有没有需要删除的数据,如果有就会删除,如果过期时间恰好在两次检查之间,那删除肯定会延迟的。基于这种机制,感觉是会对mongo
的性能有一定影响。
expireAfterSeconds: 0
使用条件和秒数大于0的情况一致,删除机制也是一样,不一样的是字段意义:
//文档将在(expireAt)被删除
db.log_events.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0} )
//这条文档将在2018-01-22 14:00:00左右被删除
db.log_events.insert( {
"expireAt": new Date('Jan 22, 2018 14:00:00'),
"logEvent": 2,
"logMessage": "Success!"
} )
crontab
以上两种方法都是基于有一个时间字段,但是mongo
的时间是UTC
时间,得到真正的local time
需要减去timeZoneOffset
1,为了去掉这个繁琐的过程,直接使用time mills(long)
作为时间字段,因此就不能用TTL
的方式去删除,因此采用自己写脚本的方式,每天定时删除数据。
- 先写脚本
#!/bash/bin
#删除创建时间在30天前的数据
MIN_DATE_NANO=`date -d \`date -d '30 days ago' +%Y%m%d\` +%s%N`;
MIN_DATE_MILL=`expr $MIN_DATE_NANO / 1000000`
echo "[`date '+%Y-%m-%d %H:%M:%S'`] start............................................." >> /root/cron_config/mongo_sweeper/mongo_swepper.log
mongo mongo_server_ip:27017<<EOF
use admin;
db.auth("user","password");
db.dbIndicators.find({"CREATE_TIME":{\$lt:$MIN_DATE_MILL}},{"_id":1}).forEach(function(item){db.dbIndicators.remove({"_id":item._id});});
exit;
EOF
echo "[`date '+%Y-%m-%d %H:%M:%S'`] end............................................." >> /root/cron_config/mongo_sweeper/mongo_swepper.log
- 再编辑一下
crontab
:
crontab -e
# 添加一行
# 每天凌晨两点执行
#input>>>>>>>>>>>>>
0 2 * * * sh /root/cron_config/mongo_sweeper/mongo_swepper.sh >> /root/cron_config/mongo_sweeper/mongo_swepper.log
#input>>>>>>>>>>>>>
# OK
测试正常。