2团
Published on 2024-08-15 / 13 Visits
0
0

MongoTemplate操作Tips

1. 默认生成_class字段

插入Java实体对象至Mongo数据库中,发现记录中存在_class属性,查询到此字段是为了便于MongoTemplate执行对象转换(至具体子对象)。

鉴于当前Java实体对象不存在子类,且_class字段不利于后续应用改造(例如更换包名等),因此按照如下方式去除_class字段。

@Configuration
public class MongoConfig {

    @Resource
    private MongoMappingContext mongoMappingContext;

    @Bean
    public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory mongoDatabaseFactory) {
        final DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDatabaseFactory);
        final MappingMongoConverter converter =
            new MappingMongoConverter(dbRefResolver, this.mongoMappingContext);
        // Remove _class field
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return converter;
    }
}

2. TTL索引设置失败

Java实体类对象字段上添加了@Indexed(expireAfter = "200d")注解,但是查询插入结果,发现未如期创建TTL索引。后续添加如下配置即可生成TTL索引:

spring:
    data:
        mongodb:
          	auto-index-creation: true

3.聚合字段缺失

项目中有按天聚合统计指令发送数值的需求,遂按照如下方式进行聚合:

Criteria criteria = Criteria.where("imei").is(imei).and(DATE).gte(startDate).lte(endDate);
var matchOperation = Aggregation.match(criteria);
var groupOperation = Aggregation.group("date")	// 按照日期字段进行聚合
	.sum(LOGIN_CNT).as(LOGIN_CNT);	// 统计每天登录数量
var sortOperation = Aggregation.sort(Sort.Direction.ASC, DATE);
var aggregation = Aggregation.newAggregation(matchOperation, groupOperation, sortOperation);
var results = mongoTemplate.aggregate(aggregation, TerminalInstructionStatistics.TABLE_NAME,
	TerminalInstructionStatisticsDailyTrend.class);

检查聚合结果,发现聚合结果中缺失"date"字段。查询后发现,Mongo在聚合后,将聚合Key(即“date”)字段映射为"_id"字段,因此需要将"_id"字段通过project重命名为"date"字段,改动如下:

Criteria criteria = Criteria.where("imei").is(imei).and(DATE).gte(startDate).lte(endDate);
var matchOperation = Aggregation.match(criteria);
var groupOperation = Aggregation.group("date")
	.sum(LOGIN_CNT).as(LOGIN_CNT);
var projectionOperation = Aggregation.project(LOGIN_CNT)
	.and("_id").as(DATE);	// 此处通过重命名操作,将_id字段转换为date字段
var sortOperation = Aggregation.sort(Sort.Direction.ASC, DATE);
var aggregation = Aggregation.newAggregation(matchOperation, groupOperation, projectionOperation, 		sortOperation);
var results = mongoTemplate.aggregate(aggregation, TerminalInstructionStatistics.TABLE_NAME,
	TerminalInstructionStatisticsDailyTrend.class);


Comment