Je suis nouveau dans les trucs de DynamoDb
. Je veux juste savoir comment interroger une table dans DynamoDB avec les hashKey
et rangeKey
.
Disons que ma table est TestTable
et son schéma est quelque chose comme ceci:
1.Id (HK of type String)
2 Date (RK of type String )
3 Name (attribute of type String)
Maintenant, si je veux interroger cette table sur la base de hashKey
qui est Id
ici, nous faisons un query
comme:
Supposons que ma requête consiste à obtenir tous les éléments ayant Id ="123".
TestTable testTable = new TestTable();
testTable.setId("123");
DynamoDBQueryExpression<TestTable> queryExpression = new DynamoDBQueryExpression<TestTable>()
.withHashKeyValues(TestTable)
.withConsistentRead(false);
Maintenant, je veux obtenir tous les articles ayant Id ="123" and Date ="1234"
.
Comment puis-je interroger cette chose dans DynamoDB
J'utilise Java
comme mon langage de programmation.
J'ai écrit un article sur les requêtes DynamoDB et l'indexation à l'aide du kit AWS Java SDK il y a quelque temps: http://labs.journwe.com/ 2013/12/15/dynamodb-Secondary-Indexes /
Dans votre cas, cela devrait fonctionner comme ceci (voir 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);
Consultez la section Java Object Persistence Model des documents DynamoDB pour plus d'informations.
Vous pouvez utiliser dynamoDbMapper.load () comme suit:
TestTable testTable = new TestTable();
testTable.setId("123");
testTable.setDate("1234");
TestTable result = dynamoDBMapper.load(testTable);
Si vous n'utilisez pas d'index, vous devez avoir exactement un élément, le cas échéant, dont Id ="123"
et Date ="1234"
.
Pour la clé de hachage exacte et la clé de plage (en cas de =
opérateur), vous n'avez pas besoin d'une opération de requête. S'il vous plaît avoir un butin à GetItem
API, qui est astucieux. Voir page de documentation .
Et si vous avez besoin d'un opérateur non égaliseur pour la clé de plage (par exemple >=
), vous pouvez utiliser expression de condition de clé dans Query
opération: Id = :id and Date >= :date
.