Sto cercando di utilizzare il nuovo Amazon DynamoDB JSON API per aggiungere/sovrascrivere le coppie valore-chiave in un attributo JSON denominato "documento". Idealmente, vorrei semplicemente strutturare le mie chiamate di scrittura per inviare le coppie KV da aggiungere all'attributo e fare in modo che Dynamo crei l'attributo se non esiste già per la chiave primaria specificata. Tuttavia se provo questo con solo un semplice UpdateItemSpec
:API DynamoDB: come posso creare una richiesta di aggiornamento "aggiungi attributo JSON se non presente"?
PrimaryKey primaryKey = new PrimaryKey("key_str", "mapKey");
ValueMap valuesMap = new ValueMap().withLong(":a", 1234L).withLong(":b", 1234L);
UpdateItemSpec updateSpec = new UpdateItemSpec().withPrimaryKey(primaryKey).withUpdateExpression("SET document.value1 = :a, document.value2 = :b");
updateSpec.withValueMap(valuesMap);
table.updateItem(updateSpec);
ottengo com.amazonaws.AmazonServiceException: The document path provided in the update expression is invalid for update
, che significa DynamoDB non riusciva a trovare l'attributo dato il nome di "documento" a cui applicare l'aggiornamento.
sono riuscito a approssimare questa funzionalità con la seguente serie di chiamate:
try {
// 1. Attempt UpdateItemSpec as if attribute already exists
} catch (AmazonServiceException e) {
// 2. Confirm the exception indicated the attribute was not present, otherwise rethrow it
// 3. Use a put-if-absent request to initialize an empty JSON map at the attribute "document"
// 4. Rerun the UpdateItemSpec call from the above try block
}
Questo funziona, ma è proprio l'ideale in quanto richiede 3 chiamate al DynamoDB ogni volta che aggiungere una nuova chiave primaria per la tavolo. Ho sperimentato un po 'con la funzione attribute_not_exists
che può essere utilizzata in Update Expressions, ma non è stata in grado di farlo funzionare nel modo che voglio.
Qualche guru della Dinamo là fuori ha qualche idea su come/se questo può essere fatto?
Mi piacerebbe davvero vedere il codice qui mentre sto affrontando la stessa sfida. L'API DynamoDB mi sembra ingenua all'estremo. –
Qualche idea se questa risposta è ancora applicabile ora? (sperando che abbiano cambiato qualcosa dal 2014) – Nadine