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);