每晚
9
点至第二天凌晨
5
点,清理
6
个月前的历史数据。
执行定时任务,生成
6
个月前的
ObjectId
,判断小于该
ObjectId
的,批量删除(每次
10000
条删除)。因为默认
_id
有索引,而无需再根据自定义的
create_ts
等时间字段创建索引再删除了,可直接利用
ObjectId
来完成,因为
ObjectId
本来就由机器码+线程id+时间戳生成,故可以推得时间戳和使用指定时间生成
ObjectId
。
实现方案使用
Spring Boot
+
Spring Data MongoDB
完成。
0 * 21-23,0-5 * * ?
定时任务跨天执行。
new ObjectId(Date)
指定时间生成
ObjectId
。
@Slf4j
@SpringBootApplication
public class DemoApplication {
@Resource
private MongoTemplate mongoTemplate;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
@Scheduled(cron = "0 * 21-23,0-5 * * ?")
public void cron() {
clean();
public void clean() {
LocalDate localDate = LocalDate.now().minusMonths(6);
System.out.println(localDate.toString());
Date from = Date.from(localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant());
ObjectId objectId = new ObjectId(from);
System.out.println(localDate.toString() + "#" + objectId.toHexString());
log.info("now#{}, ObjectId#{}", localDate.toString(), objectId.toHexString());
Query query = Query.query(Criteria.where("_id").lt(objectId)).limit(10000);
long now = System.currentTimeMillis();
DeleteResult deleteResult = mongoTemplate.remove(query, Document.class, "test_col");
log.info("delete test_col result#{}-{}, cost#{}", deleteResult.wasAcknowledged(), deleteResult.getDeletedCount(), System.currentTimeMillis() - now);
https://github.com/fendoudebb/learning/tree/master/java/learn-spring-boot/mongo-clean
阅读 4496 · 发布于 2020-06-02
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb
扫描下方二维码关注公众号和小程序↓↓↓