2017-08-22 10 views
0

すべての繰り返しの平均時間を取得する必要があります。私は、以下の説明エンティティのエンティティがあります。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 

感謝。

+2

あなたがmongoTemplate.aggregateを機能させるクラス型としてロング与えられているが、あなたは、合計&平均の両方を戻ってきています。私はそれが問題だと思う – Afridi

答えて

1

集計結果を正しくマップするには、ドメインタイプにマッピングするか、単にDocumentを返す必要があります。
あなたが探しているものは、次のようなものでなければなりません。上記集計クエリで

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

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

それは動作します!どうもありがとうございます。 –

関連する問題