2016-08-24 1 views
1

현재 LSI 및 DynamoDB 매퍼 클래스를 사용하여 발전기 DB 테이블에서 정보를로드하려고합니다. 내가이 클래스 Conisder 다음 코드를LSI 및 매퍼로 dynamodb를 쿼리하는 방법

이 있다고 가정하는 것은

class Employee { 
    @DynamoDBHashKey 
    public String getID() { 
     return ID; 
    } 
    @DynamoDBRangeKey 
    public String getFirstName() { 
     return firstName; 
    } 

    @DynamoDBIndexRangeKey(localSecondaryIndexName = "my-lsi") 
    public String getLastName() { 
    return lastName; 
    } 

    public String getMyotherfield() { 
    return myotherfield; 
    } 
} 

는 LSI 및 DynamoDB의 매퍼를 사용하여 정보를 검색하기 위해이 코드 조각을 고려

Employee obj = new Employee(); 
obj.setID("221"); 
obj.setLastName("SOMEONE"); 
DynamoDBQueryExpression<Employee> queryExpression = new DynamoDBQueryExpression<>(); 
queryExpression.setHashKeyValues(obj); 
queryExpression.setIndexName("my-lsi"); 
queryExpression.setProjectionExpression("myotherfield"); 

PaginatedQueryList<Employee> paginatedQueryList = mapper.query(Employee.class, queryExpression); 
Iterator<Employee> iterator = paginatedQueryList.iterator(); 
while (iterator.hasNext()) { 
    Employee pp = iterator.next(); 
    // some code 
} 

[편집] 이 올바른 방법으로인가 매퍼가있는 LSI를 쿼리 하시겠습니까? LSI와 dynamoDBMapper를 사용하여 테이블에서 데이터를 가져 오는 더 좋은 방법은 무엇입니까? (성능면에서)

이 또한 https://java.awsblog.com/post/Tx3GYZEVGO924K4/The-DynamoDBMapper-Local-Secondary-Indexes-and-You이지만 2013 링크입니다. LSI 및 매퍼로 쿼리하는 방법에 대한 최신 문서를 찾을 수 없습니다.

+0

"더 나은 방법"이라고했을 때 정확히 무엇을 찾으십니까? 성능 측면에서 그렇습니까? 페이지 매김의 관점에서? – Dasharath

답변

2

제공된 코드에서 범위 키를 전혀 설정하지 않았 음을 유의하십시오. 그렇게하려면 queryExpression.setRangeKeyConditions()을 사용하십시오.

Map<String, Condition> rangeKeyConditions = new HashMap<>(); 
rangeKeyConditions.put("lastName", new Condition() 
       .withComparisonOperator(ComparisonOperator.EQ) 
       .withAttributeValueList(new AttributeValue().withS("SOMEONE"))); 
queryExpression.setRangeKeyConditions(rangeKeyConditions);` 

[업데이트] :

대상물의 범위 키 값 ("사람")으로 설정하기에 충분한 (도 필요) 없다 (OBJ) 여기서

는 코드 샘플이다 그 객체는 hashKey를 설정하기 위해서만 사용되기 때문입니다. 예제를 살펴보십시오. here

+0

** queryExpression **에 ** indexName **을 설정했습니다. 또한 ** obj **에 ** lastName ** 필드를 설정했습니다. 충분하지 않아? 현재 방법은 나에게 해결책을 제시하지만 이것이 LSI를 사용하여 쿼리하는 가장 좋은 방법인지는 잘 모르겠습니다. (성능면에서나 올바른 대답을 얻으려면) –

+0

rangeKeyConditions를 사용해야합니까? –

+0

DynamoDB 쿼리의 경우 범위 키 지정은 선택 사항입니다. 귀하의 경우, my-lsi의 범위 키인 lastName을 기준으로 쿼리하려고하므로이 범위 키를 지정하는 유일한 방법은 rangeKeyConditions() 메서드를 사용하는 것입니다. 정답을 얻는 측면에서 이것이 유일한 방법입니다. 또한'queryPage()'를 볼 수도 있습니다. 'query'와'queryPage'의 차이점은 다음과 같습니다 : http://stackoverflow.com/a/32800303/2491766 – Dasharath

관련 문제