MongoDB 定时删除数据

MongoDB 定时删除数据

mongo删除范围数据

mongo删除一个范围的数据有点麻烦的,不能直接用remove方法,只能先查出来满足条件的文档,再逐个删除。如果需要删除某个范围,特别是时间范围的数据,有两种解决办法:

  1. 使用mongo TTL(Time To Live)
  2. 写个脚本,用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需要减去timeZoneOffset1,为了去掉这个繁琐的过程,直接使用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

测试正常。

猜你喜欢

转载自blog.csdn.net/cl_yd/article/details/79461528