0

각 사용자에 대한 각 레벨의 경고 수를 결과로 생성해야합니다.Spring MongoDB로 중첩 된 그룹

다음과 같은 구조 :

{ 
    "identitity": "59e3b9dc5a3254691f327b67", 
    "alerts": [ 
    { 
     "level": "INFO", 
     "count": "3" 
    }, 
    { 
     "level": "ERROR", 
     "count": "10" 

    } 
    ] 

} 

경고 entitity는 다음과 같은 구조를 가지고 : 나는 다음과 같은 방법은 중첩 된 방법으로 결과를 프로젝트에 노력 구현 한

@Document(collection = AlertEntity.COLLECTION_NAME) 
public class AlertEntity { 

    public final static String COLLECTION_NAME = "alerts"; 

    @Id 
    private ObjectId id; 

    @Field 
    private AlertLevelEnum level = AlertLevelEnum.INFO; 

    @Field("title") 
    private String title; 

    @Field("payload") 
    private String payload; 

    @Field("create_at") 
    private Date createAt = new Date(); 

    @Field("delivered_at") 
    private Date deliveredAt; 

    @Field("delivery_mode") 
    private AlertDeliveryModeEnum deliveryMode = 
    AlertDeliveryModeEnum.PUSH_NOTIFICATION; 

    @Field("parent") 
    @DBRef 
    private ParentEntity parent; 

    @Field("son") 
    @DBRef 
    private SonEntity son; 

    private Boolean delivered = Boolean.FALSE; 

} 

합니다. 그러나 "Identity"필드는 항상 null이고 "alerts"필드는 빈 컬렉션입니다. 다음과 같이 DTO는

{ 
    "response_code_name": "ALERTS_BY_SON", 
    "response_status": "SUCCESS", 
    "response_http_status": "OK", 
    "response_info_url": "http://yourAppUrlToDocumentedApiCodes.com/api/support/710", 
    "response_data": [ 
    { 
     "identity": null, 
     "alerts": [] 
    }, 
    { 
     "identity": null, 
     "alerts": [] 
    } 
    ], 
    "response_code": 710 
} 

결과 :

@Override 
    public List<AlertsBySonDTO> getAlertsBySon(List<String> sonIds) { 


     TypedAggregation<AlertEntity> alertsAggregation = 
       Aggregation.newAggregation(AlertEntity.class, 
        Aggregation.group("son.id", "level").count().as("count"), 
        Aggregation.project().and("son.id").as("id") 
         .and("alerts").nested(
           bind("level", "level").and("count"))); 

     // Aggregation.match(Criteria.where("_id").in(sonIds) 

      AggregationResults<AlertsBySonDTO> results = mongoTemplate. 
       aggregate(alertsAggregation, AlertsBySonDTO.class); 

      List<AlertsBySonDTO> alertsBySonResultsList = results.getMappedResults(); 

      return alertsBySonResultsList; 
    } 

내가 얻을 결과는 다음과 같다 중첩 된 방법으로 결과를 프로젝트 수행해야 할 무엇

public final class AlertsBySonDTO implements Serializable { 

    private static final long serialVersionUID = 1L; 


    @JsonProperty("identity") 
    private String id; 

    @JsonProperty("alerts") 
    private ArrayList<Map<String, String>> alerts; 


    public AlertsBySonDTO() { 
     super(); 
    } 

    public AlertsBySonDTO(String id, ArrayList<Map<String, String>> alerts) { 
     super(); 
     this.id = id; 
     this.alerts = alerts; 
    } 



    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public ArrayList<Map<String, String>> getAlerts() { 
     return alerts; 
    } 

    public void setAlerts(ArrayList<Map<String, String>> alerts) { 
     this.alerts = alerts; 
    } 
} 

? 통합 워크 미리

답변

1

덕분이 기본적 배열에서 하나 개의 원소와 두 개의 문서 두 요소의 중첩 배열하여 하나 개의 요소 컬렉션 변환 것이다 $unwind 연산자있다.

{ 
"identitity": "59e3b9dc5a3254691f327b67", 
"alerts": { 
    "level": "INFO", 
    "count": "3" 
    } 

}

{ 
    "identitity": "59e3b9dc5a3254691f327b67", 
    "alerts": { 
     "level": "ERROR", 
     "count": "10" 
    } 
} 

을 그리고 당신은 카운트하여 그룹을 시작할 수 있습니다 곳이다 : 그래서 당신은 얻을 것이다. 잘 작동해야합니다.