2015-11-23 187 views
0

我和翻譯在Spring數據的MongoDB MongoDB的這種掙扎查詢:春數據MongoDB的聚集查詢

db.applicates.aggregate(
    [ 
    { 
     "$match": { 
     "claimantCategory": 1 
     } 
    }, 
     { 
     $group : { 
      _id : { month: { $month: "$claimDate" }, day: { $dayOfMonth: "$claimDate" }, year: { $year: "$claimDate" } }, 
     count: { $sum: 1 } 
    } 
    } 
    ] 
) 

我tryed這一點:

TypedAggregation<Applicate> aggregation = newAggregation(Applicate.class, 
      match(Criteria.where("claimantCategory").is(claimantCategory)), 
      project("claimDate") 
        .andExpression("dayOfMonth("+"\""+"claimDate"+"\""+")").as("day") 
        .andExpression("month(claimDate)").as("month") 
        .andExpression("year(claimDate)").as("year"), 
      group(fields().and("day").and("month").and("year")) 
        .count().as("count")); 
AggregationResults<ClaimsAggregator> groupResults = mongoOperations.aggregate(aggregation, ClaimsAggregator.class); 

但它失敗例外:可以「T從BSON String類型轉換爲Date

我Applicate.class:

public class Applicate { 

@Id 
private String id; 

private int claimId; 

@DateTimeFormat (iso = DateTimeFormat.ISO.DATE) 
private Date claimDate; 

private int codeOfForm; 
private String claimStatus; 
private String fio; 
private int claimantCategory; 
private int serviceCode; 
private String subserviceName; 
private String departmentName; 
//getter,setters, constructor 
} 

ClaimsAggregator.class:

public class ClaimsAggregator { 
private String claimDate; 
private int count; 
.... 
} 
+0

替換行'.andExpression( 「請將dayOfMonth(」 + 「\」 「+」 claimDate 「+」 \ 「」 + 「)」)。作爲( 「日」)'與此'.andExpression( 「請將dayOfMonth(claimDate)」)。如( 「天」)'。 – chridam

+0

@chridam,謝謝你的建議。剛剛測試過,現在它在日期字段中返回null。什麼可能導致? – MoOFueL

+0

不太確定,可能是某些沒有'claimDate'字段的文檔? – chridam

回答

0

我找到一個答案! 爲@chridam建議,u需要與此

.andExpression("dayOfMonth(claimDate)").as("day") 

現在,你需要添加更換線

.andExpression("dayOfMonth("+"\""+"claimDate"+"\""+")").as("day") 

.first("claimDate").as("claimDate") 

排隊

group(fields().and("day").and("month").and("year")) 

決賽代碼:

TypedAggregation<Applicate> aggregation = newAggregation(Applicate.class, 
      match(Criteria.where("claimantCategory").is(claimantCategory)), 
      project("claimDate") 
        .andExpression("dayOfMonth(claimDate)").as("day") 
        .andExpression("month(claimDate)").as("month") 
        .andExpression("year(claimDate)").as("year"), 
      group(fields().and("day").and("month").and("year")).first("claimDate").as("claimDate") 
        .count().as("count"));