2017-03-16 81 views
0

我有group by查询如下所示。我如何使用Spring Mongo组成相同的查询?任何人都可以请帮助在下面形成Jersey QuerySpring Mongo Group通过GroupBy查询查询

db.Defects.aggregate([ 
    { "$group": { 
     "_id": { 
      "opendate": "$opendate", 
      "status": "$status" 
     }, 
     "statusCount": { "$sum": 1 } 
    }}, 
    { "$group": { 
     "_id": "$_id.opendate", 
     "statuses": { 
      "$push": { 
       "status": "$_id.status", 
       "count": "$statusCount"` 
      }, 
     }, 

    }}, 
    { "$sort": { "count": -1 } } 


]) 

我有我的球衣春季服务层 我需要获得日期分组第一和状态的那些状态特定的日期和数量分别。

@GET 
@Path("/defecttrendchartdata") 
@Produces(MediaType.APPLICATION_JSON) 
    public List<DefectTrendVO> getDefecttrendchart() throws JsonParseException, JsonMappingException, IOException{ 
     DefectTrendVO deftrendvo =new DefectTrendVO(); 
     List<DefectTrendVO> trendvolist = new ArrayList<DefectTrendVO>(); 




    Aggregation agg = newAggregation(
      group("opendate").count().as("count"), 
      project("count").and("opendate").previousOperation()); 

    AggregationResults<DefectStatusVO> groupResults 
    = getMongoOperation().aggregate(agg, DefectVO.class, DefectStatusVO.class); 
    List<DefectStatusVO> result = groupResults.getMappedResults(); 





    for(int i=0;i<result.size();i++){ 

     List<DefectStatusVO> result1 = new ArrayList<DefectStatusVO>(); 
     Aggregation agg1 = newAggregation(
        match(Criteria.where("opendate").is(result.get(i).getOpendate())), 
       group("status").count().as("statuscount"), 
       project("statuscount").and("status").previousOperation());  

     System.out.println("Aggregation Result "+agg1); 

     AggregationResults<DefectStatusVO> groupResultsFinal 
     = getMongoOperation().aggregate(agg1, DefectVO.class, DefectStatusVO.class); 

     result1 = groupResultsFinal.getMappedResults(); 
     System.out.println(result1.size()+"Result Size"); 

     Date dateString = result.get(i).getOpendate(); 
     for(int j=0;j<result1.size();j++){ 


      deftrendvo =new DefectTrendVO(); 
       if(result1.get(j).getStatus().equalsIgnoreCase("Closed")){ 
        closedCnt= result1.get(j).getStatuscount(); 
        deftrendvo.setClosedDefects(closedCnt); 
        System.out.println("closed defect"+deftrendvo.getClosedDefects()); 
        } 
       else if(result1.get(j).getStatus().equalsIgnoreCase("Open")){ 
        openCnt=result1.get(j).getStatuscount(); 
        deftrendvo.setOpenDefects(openCnt); 
        } 
       else if(result1.get(j).getStatus().equalsIgnoreCase("Fixed")){ 
        newCnt=result1.get(j).getStatuscount(); 
        deftrendvo.setFixedDefects(newCnt); 
        } 
       else if(result1.get(j).getStatus().equalsIgnoreCase("Rejected")){ 
        rejectedCnt=result1.get(j).getStatuscount(); 
        deftrendvo.setRejectedDefects(rejectedCnt); 
        } 
       else if(result1.get(j).getStatus().equalsIgnoreCase("New")){ 
        rejectedCnt=result1.get(j).getStatuscount(); 
        deftrendvo.setNewDefects(rejectedCnt); 
        } 

       Date date = new Date(); 
       date=dateString; 
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
       String format = formatter.format(date);   
       deftrendvo.setDate(format); 
       trendvolist.add(deftrendvo);      
      }    

    } 
    return trendvolist; 
} 

这给出如下结果。但我需要的日期不应该重复

[{"newDefects":0,"closedDefects":7,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-01"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":7,"date":"2016-01-01"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":9,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-01"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":4,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-05"},{"newDefects":0,"closedDefects":6,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-05"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":10,"date":"2016-01-05"},{"newDefects":2,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-12"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":10,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-12"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":5,"date":"2016-01-12"},{"newDefects":0,"closedDefects":9,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-12"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":3,"date":"2016-01-15"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":6,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-15"},{"newDefects":0,"closedDefects":4,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-15"},{"newDefects":6,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-15"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":3,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-21"},{"newDefects":7,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-21"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":11,"date":"2016-01-21"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":3,"date":"2016-01-26"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":6,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-26"},{"newDefects":5,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-26"},{"newDefects":0,"closedDefects":3,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-26"},{"newDefects":0,"closedDefects":6,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-23"},{"newDefects":3,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-23"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":3,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-23"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":10,"date":"2016-01-23"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":5,"date":"2016-01-31"},{"newDefects":0,"closedDefects":0,"fixedDefects":0,"openDefects":4,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-31"},{"newDefects":0,"closedDefects":4,"fixedDefects":0,"openDefects":0,"reopenDefects":0,"rejectedDefects":0,"date":"2016-01-31"}] 

回答

0

你可以尝试下面的春季聚合。

我忘了$sort阶段,因为您拥有的count字段不是有效字段。修复shell查询后,我将修复代码。

AggregationOperation firstGroup = Aggregation.group("opendate","status").count().as("statusCount"); 
AggregationOperation secondGroup = Aggregation.group("_id.opendate").push(new BasicDBObject("status", "$_id.status").append("count", "$statusCount")).as("statuses"); 
Aggregation agg = Aggregation.newAggregation(firstGroup, secondGroup);