Debido a los criterios, el mismo parámetro no se puede agregar repetidamente. Por ejemplo, el siguiente printDateStr informará un error cuando el bucle for alcance la segunda vez.
for (String certificateDate : dataList) {
criteria.and("printDateStr").is(certificateDate);
query.addCriteria(criteria);
List<UserCertificatePrintRecordVo> userCertificatePrintRecordVos = mongoTemplate.find(query, UserCertificatePrintRecordVo.class);
for (UserCertificatePrintRecordVo userCertificatePrintRecordVo : userCertificatePrintRecordVos) {
classHours += userCertificatePrintRecordVo.getClassScores();
}
dataMap.put(certificateDate, classHours);
classHours = 0.0;
}
Podemos usar Aggregation para resolverlo, de la siguiente manera:
private Map<String, Object> setUserCertificateTotalClassHours(List<String> dataList) {
Criteria criteria = new Criteria();
Map<String, Object> dataMap = new HashMap<>(16);
double classHours = 0.0;
for (String certificateDate : dataList) {
// 设置条件
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(new Criteria().andOperator(criteria.where("printDateStr").is(certificateDate), criteria))
);
// 查询
AggregationResults<UserCertificatePrintRecordVo> carFlowResultVOs = mongoTemplate.aggregate(aggregation,
"UserCertificatePrintRecordVo", UserCertificatePrintRecordVo.class);
List<UserCertificatePrintRecordVo> userCertificatePrintRecordVos = carFlowResultVOs.getMappedResults();
for (UserCertificatePrintRecordVo userCertificatePrintRecordVo : userCertificatePrintRecordVos) {
classHours += userCertificatePrintRecordVo.getClassScores();
}
dataMap.put(certificateDate, classHours);
classHours = 0.0;
}
return dataMap;
}