web-dev-qa-db-fra.com

Comment faire une requête dans DynamoDB sur la base de HashKey et de Key Key?

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.

13
Geek_To_Learn

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.

11
Markus Klems

Vous pouvez utiliser dynamoDbMapper.load () comme suit:

TestTable testTable = new TestTable();
testTable.setId("123");
testTable.setDate("1234");
TestTable result = dynamoDBMapper.load(testTable);
7
Nikita

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.

3
Mingliang Liu