2017-12-01 7 views
2

조건으로 DynamoDB의 테이블에 항목을 삽입 :두 가지 조건

  1. (hashKey는 rangekey) 조합이 이미 테이블에 존재하지 않아야

  2. 새로 삽입 범위 키 값은보다 1이어야합니다 최대 rangeKey 지금까지.

나는 expectedValueAttribute가 여기에 지정된 사용하려고 해요 : http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExpectedAttributeValue.html

하지만 한 번에 하나 개의 조건을 넣을 수 있습니다. 두 조건을 모두 적용하는 방법?

Map<String, ExpectedAttributeValue> expectedAttributes = ... 
    .put(hashKey, new ExpectedAttributeValue(false)) 
    .put(rangeKey, new ExpectedAttributeValue(false)) 
    .build(); 

위의 조건 1 만 만족합니다.

+0

당신이'ExpectedAttributeValue() .withValue (새의 AttributeValue(). withN ("20")) .withComparisonOperator (ComparisonOperator.LT) 같은 ** 비교 연산자 ** 뭔가를 시도'이 예로 이동하시기 바랍니다 어쩌면 이것이 도움이 될 것입니다. https://aws.amazon.com/blogs/developer/using-improved-conditional-writes-in-dynamodb/ –

답변

0

기존 범위 키의 최대 값을 처음으로 쿼리하지 않고 비교할 수 없으므로 두 단계로이를 수행해야합니다.

1) 키를 당신의 주어진 파티션

2) 반환 된 키가 정확히 하나의 작은 경우 당신이 가지고있는 하나가 반환 범위의 키를 비교하여 가장 높은 범위 키를 사용하여 항목을 가져 오기, 새 항목을 넣어. (쿼리가 이미 존재하지 않음을 확인 했으므로 항목이 이미 있는지 여부를 실제로 확인하지 않아도됩니다.

DynamoDB는 지정된 파티션의 범위 키 순서로 항목을 저장하며 지정된 파티션의 항목을이 순서로 반환합니다. 범위 키가 숫자 인 경우 정렬 순서는 숫자이며 파티션에 대한 최종 결과가 첫 번째가 아닌 결과를 원하게됩니다. ScanIndexForward를 사용하여 쿼리의 순서를 존중하고 첫 번째 항목을 가져올 수 있습니다.

쿼리는 다음과 같습니다

항목 범위 키가 새 항목 범위 키 이상의 이하인
Table table = dynamoDB.getTable("YOUR_TABLE"); 

QuerySpec spec = new QuerySpec() 
    .withKeyConditionExpression("hash = :v_hash") 
    .withValueMap(new ValueMap() 
     .withString(":v_hash", "your_hash") 
    .withScanIndexForward(false) 
    .setMaxResultSize(1); 

ItemCollection<QueryOutcome> items = table.query(spec); 

경우, 항목을 넣어. 항목 목록이 비어 있으면 (즉, 파티션 키가 아직 존재하지 않는 경우) 동작을 고려해야합니다.