2014-10-21 11 views
10

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?

risposta

4

Ho ricevuto una risposta da Amazon Support che in realtà non è possibile eseguire questa operazione con una singola chiamata. Hanno suggerito di ridurre il numero di chiamate quando si aggiunge l'attributo per una nuova chiave primaria da 3 a 2, utilizzando la mappa JSON desiderata nella richiesta put-if-absent anziché una mappa vuota.

+3

Mi piacerebbe davvero vedere il codice qui mentre sto affrontando la stessa sfida. L'API DynamoDB mi sembra ingenua all'estremo. –

+1

Qualche idea se questa risposta è ancora applicabile ora? (sperando che abbiano cambiato qualcosa dal 2014) – Nadine

Problemi correlati