2015-06-15 7 views
7

Jestem nowy w rzeczach DynamoDb. Chcę tylko wiedzieć, jak możemy zapytać na stole w DynamoDB z hashKey i rangeKey.Jak wykonać kwerendę w DynamoDB na podstawie klucza HashKey i zakresu?

Powiedzmy moim stole jest TestTable i to schemat jest mniej więcej tak:

1.Id (HK of type String) 
2 Date (RK of type String) 
3 Name (attribute of type String) 

Teraz jeśli chcę kwerendy w tej tabeli na podstawie hashKey która Id tu robimy query jako:

Powiedzmy moja kwerenda jest, aby wszystkie przedmioty posiadające Id ="123".

TestTable testTable = new TestTable(); 
testTable.setId("123"); 

DynamoDBQueryExpression<TestTable> queryExpression = new DynamoDBQueryExpression<TestTable>() 
                   .withHashKeyValues(TestTable) 
                   .withConsistentRead(false); 

Teraz chcę uzyskać wszystkie przedmioty posiadające Id ="123" and Date ="1234".

Jak mogę kwerendy tę cechę DynamoDB

używam java jako mój język programowania.

Odpowiedz

7

pisałem artykuł o zapytaniach DynamoDB i indeksowanie przy użyciu AWS Java SDK jakiś czas temu: http://labs.journwe.com/2013/12/15/dynamodb-secondary-indexes/

W twoim przypadku, powinna ona pracować tak (patrz http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaQueryScanORMModelExample.html):

AmazonDynamoDBClient client = new AmazonDynamoDBClient(new ProfileCredentialsProvider()); 
DynamoDBMapper mapper = new DynamoDBMapper(client); 

String hashKey = "123"; 
long twoWeeksAgoMilli = (new Date()).getTime() - (15L*24L*60L*60L*1000L); 
Date twoWeeksAgo = new Date(); 
twoWeeksAgo.setTime(twoWeeksAgoMilli); 
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); 
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); 
String twoWeeksAgoStr = dateFormatter.format(twoWeeksAgo);    
Condition rangeKeyCondition = new Condition() 
     .withComparisonOperator(ComparisonOperator.GT.toString()) 
     .withAttributeValueList(new AttributeValue().withS(twoWeeksAgoStr.toString())); 

Reply replyKey = new Reply(); 
replyKey.setId(hashKey); 

DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>() 
     .withHashKeyValues(replyKey) 
     .withRangeKeyCondition("ReplyDateTime", rangeKeyCondition); 

List<Reply> latestReplies = mapper.query(Reply.class, queryExpression); 

Aby uzyskać więcej informacji, zapoznaj się z sekcją Model Persistence Object języka Java w dokumentach DynamoDB.

+0

Hej .. Znam już swój artykuł ... To jest rzeczywiście ładny one.Actually Nie chcę, aby taki stan do obsługi klucza zasięgu. Czy nie ma innego sposobu? –

+0

Inna możliwość, którą widzę (ale jeszcze nie próbowałem) to użycie api Java o niskim poziomie api: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryingJavaDocumentAPI.html 'QuerySpec () .withKeyConditionExpression ("Id =: v_id i Date =: v_date"). withValueMap (new ValueMap(). withString (": v_id", "123") .withString (": v_date", "1234") ' –

2

Jeśli nie korzystasz z indeksu, powinieneś mieć dokładnie jeden przedmiot, jeśli taki istnieje, którego Id ="123" i Date ="1234".

Aby uzyskać dokładny klucz skrótu i ​​zakres (w przypadku operatora =), nie trzeba wykonywać operacji zapytania. Proszę mieć łup na GetItem API, który jest dobry. Zobacz documentation page.

A jeśli potrzebujesz operatora non-EQ do klucza Range (np >=), można użyć key condition expression w Query pracy: Id = :id and Date >= :date.

4

Można użyć dynamoDbMapper.load() w następujący sposób:

TestTable testTable = new TestTable(); 
testTable.setId("123"); 
testTable.setDate("1234"); 
TestTable result = dynamoDBMapper.load(testTable); 
Powiązane problemy