2017-08-22 1 views
0

J'ai besoin de connaître la durée moyenne de toutes les itérations effectuées. Je l'entité de l'entité que je vous expliquer ci-dessous:Obtenir une moyenne simple de la collection avec 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<>(); 

} 

J'ai mis en place une méthode personnalisée référentiel pour effectuer cette opération mais je reçois une erreur quand je reçois le résultat.

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

    } 

Lorsque la méthode est exécutée, je reçois cette exception:

org.springframework.data.mapping.model.MappingException: No mapping metadata found for java.lang.Long 

Merci à l'avance.

+2

Dans requête d'agrégation ci-dessus, vous retournez à la fois somme et moyenne, alors que vous avez donné Long comme un type de classe pour fonctionner mongoTemplate.aggregate. Je pense que c'est le problème – Afridi

Répondre

1

Afin de mapper correctement le résultat d'agrégation, il doit être mappé à un type de domaine ou simplement le Document renvoyé.
Quelque chose comme ci-dessous devrait faire ce que vous cherchez.

class AggResult { 
    @Field("total_duration") Long duration; 
    @Field("avg_duration") Double avgDuration; 
} 

return template 
    .aggregate(aggregation, COLLECTION_NAME, AggResult.class) 
    .getUniqueMappedResult() 
    .getAvgDuration(); 
+0

Cela fonctionne !! Merci beaucoup. –