1、前言
在之前操作mongo的过程中,都是自动创建,几乎没有手动创建过表。
这次开发中有张表数据量大,并且不是特别重要,数据表维护一个常见的问题是过期数据没有被及时清理,导致数据量过大,查询变得缓慢。为了解决这个问题,我们可以通过创建过期索引来定期清理过期数据。
数据过期的原理可以看下之前的文章:我屮艸芔茻,mongo居然可以自动删除数据
2、直接上代码
逻辑很简单,在服务器启动之后去检查索引
1.先检查存不存在这个索引
2.然后创建索引
3.在每个entity中增加了一个save_time的字段
package com.tyjt.ccpparking.mgr;import com.tyjt.ccpparking.domain.entity.ParkingHBEntity;
import com.tyjt.ccpparking.domain.entity.ParkingRestInfoEntity;
import com.tyjt.ccpparking.msg.EmqxHBHandler;
import com.tyjt.ccpparking.service.ParkingService;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.index.Index;
import org.springframework.data.mongodb.core.index.IndexDefinition;
import org.springframework.data.mongodb.core.index.IndexInfo;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;@Component
@Data
public class Mgr implements ApplicationRunner {private static Logger logger = LoggerFactory.getLogger(Mgr.class);@ResourceMongoTemplate mongoTemplate;public Mgr() {mgr = this;}private static Mgr mgr;public static Mgr getInstance() {return mgr;}@Overridepublic void run(ApplicationArguments args) throws Exception {createMongoIndex(ParkingHBEntity.class);createMongoIndex(ParkingRestInfoEntity.class);}/*** 创建mongo的索引** @param clazz*/public void createMongoIndex(Class clazz) {try {if (isIndexExists(clazz)) {return;}Index index = new Index();index.on("save_time", Sort.Direction.DESC);index.expire(7, TimeUnit.DAYS);mongoTemplate.indexOps(clazz).ensureIndex(index);} catch (Exception e) {logger.error("create index fail {}", clazz.getName(), e);}}public boolean isIndexExists(Class clazz) {List<IndexInfo> indexInfos = mongoTemplate.indexOps(clazz).getIndexInfo();for (IndexInfo indexInfo : indexInfos) {if ("save_time_-1".equals(indexInfo.getName())) {return true;}}return false;}
}
注:这里可以直接接写collection name,
也可以使用实体的class,因为mongo的entity的注解有@Document(collection = "parking_HB")
注:在删除表的时候也会删除索引
3、总结
在Mongo数据库中创建过期索引,定期清理过期数据以保证数据的质量和性能。
创建过期索引可以大大简化过期数据的清理过程,并且可以帮助我们避免在查询和数据分析时出现问题。
同时,定期清理过期数据可以提高查询和分析的效率,保证系统的性能。
希望本文对您在Mongo数据库管理和维护方面有所帮助。如果您有任何问题或建议,请在下方留言区留言,我将尽快回复