Spring

스프링 데이터 mongodb를 사용하여 필드의 하위 문자열에 대한 집계 결과를 얻는 방법

기록만이살길 2021. 3. 24. 07:03
반응형

스프링 데이터 mongodb를 사용하여 필드의 하위 문자열에 대한 집계 결과를 얻는 방법

1. 질문(문제점):

이 데이터가 있습니다.

{ "_id" : ObjectId("5ff9227f0c7f5b1601fcceeb"), "geoHash" : "dr72zc5v7440", "customerId" : "abcd"}
{ "_id" : ObjectId("5ff9227f0c7f5b1601fcceec"), "geoHash" : "dr7965kev5r7", "customerId" : "abcd" }
{ "_id" : ObjectId("5ff9227f0c7f5b1601fcceed"), "geoHash" : "dr79umt6rksy", "customerId" : "abcd" }
{ "_id" : ObjectId("5ff9227f0c7f5b1601fcceee"), "geoHash" : "dr7dqxy2cw43", "customerId" : "abcd" }
{ "_id" : ObjectId("5ff9227f0c7f5b1601fcceef"), "geoHash" : "dr7g0czp7xrt", "customerId" : "abcd"}
{ "_id" : ObjectId("5ff9227f0c7f5b1601fccef0"), "geoHash" : "dr7gehpyjbv0", "customerId" : "abcd"}
{ "_id" : ObjectId("5ff9227f0c7f5b1601fccef1"), "geoHash" : "dr7ujw2u8447", "customerId" : "abcd"}
{ "_id" : ObjectId("5ff9227f0c7f5b1601fccef2"), "geoHash" : "dr7uzb9e45ry", "customerId" : "abcd" }
{ "_id" : ObjectId("5ff9227f0c7f5b1601fccef3"), "geoHash" : "drkj64f3skv6", "customerId" : "abcd" }
{ "_id" : ObjectId("5ff9227f0c7f5b1601fccef4"), "geoHash" : "drkjum50nw4t", "customerId" : "abcd" }

Mongo db 쿼리 :

db.test.aggregate([{ $match : { "customerId" : "abcd" } }, { "$group": {          "_id": {$substr:["$geoHash",0,4]},count: { $sum: 1 }         }} ])

이 쿼리를 Spring mongo Java 코드로 어떻게 변환합니까? 아래는 작동하지 않습니다.

AggregationOperation group = Aggregation.group("geoHash")
                .first(StringOperators.Substr.valueOf("geoHash").substring(0, 4))
                .as("geoHash")
                .count().as("geoHashCount");

2. 해결방안:

원하는 것을 얻는 한 가지 방법 Spring Data MongoDBProjectOperation먼저 사용하는 것 입니다. 예를 들면 다음과 같습니다.

데이터 세트에 따라 6 개의 레코드 를 반환해야합니다 .

MatchOperation matchOperation = Aggregation
        .match(new Criteria("customerId").is("abcd"));
ProjectionOperation projectionOperation = Aggregation
        .project("geoHash")
        .andExpression("substr(geoHash, 0, 4)").as("geoHash");
GroupOperation groupOperation = Aggregation
        .group("geoHash")
        .count().as("count");

Aggregation aggregation = Aggregation
        .newAggregation(matchOperation, projectionOperation, groupOperation);
AggregationResults<Object> aggregationResults
        = mongoTemplate.aggregate(aggregation, "collection_name", Object.class);
65639413
반응형