从 Spring 数据 MongoDB 的集合中获取简单平均值
Get simple average from collection with Spring Data MongoDB
我需要获得所有迭代的平均持续时间。我有下面解释的实体实体:
@Document(collection = IterationEntity.COLLECTION_NAME)
public class IterationEntity {
public final static String COLLECTION_NAME = "iterations";
@Id
private ObjectId id;
@Field("start_date")
private Date startDate;
@Field("finish_date")
private Date finishDate;
@Field("duration")
private Long duration;
@Field("total_tasks")
private Integer totalTasks = 0;
@Field("total_failed_tasks")
private Integer totalFailedTasks = 0;
@Field("total_comments")
private Integer totalComments = 0;
@Field("tasks")
@DBRef
@CascadeSave
private Set<TaskEntity> tasks = new HashSet<>();
}
我已经实现了一个自定义存储库方法来执行此操作,但是当我得到结果时出现错误。
@Override
public Long getAvgDuration() {
GroupOperation avgOperation = Aggregation.group()
.sum("duration")
.as("total_duration")
.avg("total_duration")
.as("avg_duration");
Aggregation aggregation = newAggregation(IterationEntity.class, avgOperation);
return mongoTemplate.aggregate(aggregation, IterationEntity.COLLECTION_NAME, Long.class).getUniqueMappedResult();
}
执行该方法时出现此异常:
org.springframework.data.mapping.model.MappingException: No mapping metadata found for java.lang.Long
提前致谢。
为了正确映射聚合结果,需要将其映射到域类型或简单地返回 Document
。
像下面这样的东西应该可以满足您的需求。
class AggResult {
@Field("total_duration") Long duration;
@Field("avg_duration") Double avgDuration;
}
return template
.aggregate(aggregation, COLLECTION_NAME, AggResult.class)
.getUniqueMappedResult()
.getAvgDuration();
我需要获得所有迭代的平均持续时间。我有下面解释的实体实体:
@Document(collection = IterationEntity.COLLECTION_NAME)
public class IterationEntity {
public final static String COLLECTION_NAME = "iterations";
@Id
private ObjectId id;
@Field("start_date")
private Date startDate;
@Field("finish_date")
private Date finishDate;
@Field("duration")
private Long duration;
@Field("total_tasks")
private Integer totalTasks = 0;
@Field("total_failed_tasks")
private Integer totalFailedTasks = 0;
@Field("total_comments")
private Integer totalComments = 0;
@Field("tasks")
@DBRef
@CascadeSave
private Set<TaskEntity> tasks = new HashSet<>();
}
我已经实现了一个自定义存储库方法来执行此操作,但是当我得到结果时出现错误。
@Override
public Long getAvgDuration() {
GroupOperation avgOperation = Aggregation.group()
.sum("duration")
.as("total_duration")
.avg("total_duration")
.as("avg_duration");
Aggregation aggregation = newAggregation(IterationEntity.class, avgOperation);
return mongoTemplate.aggregate(aggregation, IterationEntity.COLLECTION_NAME, Long.class).getUniqueMappedResult();
}
执行该方法时出现此异常:
org.springframework.data.mapping.model.MappingException: No mapping metadata found for java.lang.Long
提前致谢。
为了正确映射聚合结果,需要将其映射到域类型或简单地返回 Document
。
像下面这样的东西应该可以满足您的需求。
class AggResult {
@Field("total_duration") Long duration;
@Field("avg_duration") Double avgDuration;
}
return template
.aggregate(aggregation, COLLECTION_NAME, AggResult.class)
.getUniqueMappedResult()
.getAvgDuration();