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; 

} 

を私は次のメソッドは、ネストされた方法で結果を予測しようとし実施しています。しかし、「アイデンティティ」フィールドは常にヌルであり、「アラート」フィールドは空のコレクションです。

@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; 
    } 

私が得る結果は以下の通りです:

{ 
    "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 
} 

結果、以下のようにDTOは次のとおりです。

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

おかげで基本的にこの配列から一つの要素を持つ2つの別々の文書に二つの要素のネストされた配列を使用して1つの要素のコレクションを変換します$unwindオペレータがあります。

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

}

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

をそして、あなたは、カウントを持つことにより、あなたのグループを開始することができる場所です。だから、取得します。うまく動作するはずです。

関連する問題