2017-08-13 1 views
0

J'ai un DynamoDB et voudrais essayer de mettre à jour certaines entrées et d'insérer celles qui n'existent pas. Mon apparence actuelle de code comme ceci:DynamoDB-Java écriture si existe mise à jour sinon

updateItemSpec = new UpdateItemSpec() 
       .withPrimaryKey(ITable.ID, 
       request.getID().getValue()) 
       .withUpdateExpression(updatedExpressionSetString) 
       .withNameMap(nameMap) 
       .withValueMap(valueMap) 
try { 
     table.updateItem(updateItemSpec); 
} 

Lorsque le updateExpression est:

SET supply.#var0 = 
if_not_exists(supply.#var0,:default) + :val0, 
date = :dateVal 

Tout cela fonctionne très bien jusqu'à ce qu'une atteindre une entrée où la clé primaire n'existe pas déjà. Lorsque cela se produit ce code lance l'exception:

Le chemin du document fourni dans l'expression de mise à jour est valide pour la mise à jour (Service: AmazonDynamoDBv2; Code d'état: 400; Code d'erreur: ValidationException;)

Ma question est la suivante: Comment est-ce que je corrige ce code pour qu'il insère quand il atteint une clé primaire, mise à jour quand il atteint une clé primaire qui existe déjà sans avoir besoin d'une lecture supplémentaire pour vérifier si elle existe au préalable?

+0

avez-vous essayé d'exécuter ceci avec une table qui n'a pas de clé primaire? – efekctive

+0

Eh bien, la table est vide par défaut, mais j'ai toujours besoin de garder la clé primaire ou sinon je n'ai pas de clé null pour GetItem, DeleteItem, ou UpdateItem error_ – MatthewO

+0

Je veux dire essayer d'isoler le problème. Essayez une mise à jour simple si cela fonctionne alors vous savez que le problème est le si existe. Je n'ai pas accès à mon environnement java maintenant – efekctive

Répondre

0

Je ne me rappelais pas si la PK était obligatoire. C'est. De la documentation java:

if_not_exists (chemin, opérandes) - si l'élément ne contient pas un attribut à l'emplacement spécifié, puis if_not_exists évalue à opérande; sinon, il évalue à path. Vous pouvez utiliser cette fonction pour pour éviter d'écraser un attribut qui peut déjà être présent dans l'élément .

Mais cette

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.UpdateData.html

indique qu'il est possible.

La valeur ne semble pas être le PK. Est-ce que l'upsert fonctionne sur la table sans expression?