2015-11-23 3 views
0

я борюсь с переводом этого запроса MongoDB в Spring Data MongoDB:Spring данные для агрегации запросов MongoDB

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

Я судимый это:

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

Но он терпит неудачу с исключением: может «т преобразование из типа BSON строки для Дата

Мой 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 предложил, и необходимо заменить линии

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

с этим

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

Теперь вам нужно добавить

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

к линии

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

Final код:

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")); 
Смежные вопросы