2015-05-15 5 views
12

Il nuovo AWS DynamoDB document API consente 2 nuovi tipi di dati che corrispondono direttamente alla rappresentazione JSON sottostante: Mappa (noto anche come oggetto JSON) e Elenco (ovvero matrice JSON).Come aggiornare una mappa o un elenco sull'API di documenti AWS DynamoDB?

Tuttavia, non riesco a trovare un modo per aggiornare gli attributi di questi tipi di dati senza sovrascriverli completamente. Al contrario, un attributo numero può essere aggiornato con l'aggiunta di un altro numero, quindi in Java si può fare qualcosa di simile:

new AttributeUpdate("Some numeric attribute").addNumeric(17); 

Allo stesso modo è possibile addElements a un attributo di un tipo di dati Set. (Nella vecchia API si usa AttributeAction.ADD per entrambi gli scopi.)

Ma per una mappa o un elenco, sembra che sia necessario aggiornare localmente il valore precedente, quindi inserirlo al posto di tale valore, ad esempio in Java :

List<String> list = item.getList("Some list attribute"); 
list.add("new element"); 
new AttributeUpdate("Some list attribute").put(list); 

Questo è molto meno leggibile, e in alcune circostanze molto meno efficiente.

Quindi le mie domande sono:

  1. C'è un modo per aggiornare un attributo di una mappa o di un tipo di dati Lista senza sovrascrivere il valore precedente? Ad esempio, per aggiungere un elemento a un elenco o per inserire un elemento in una mappa?

  2. Come implementarlo utilizzando l'API Java?

  3. Sei a conoscenza di piani per supportare questo in futuro?

+1

C'è la documentazione più recente che parla di come aggiungere elementi alle liste; vedi http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.SET.UpdatingListElements –

risposta

10

Si prega di dare un'occhiata al UpdateExpression nel UpdateItem API

Ad esempio dato un elemento con un elenco:

{ 
    "hashkey": {"S" : "my_key"}, 
    "my_list" : {"L": 
     [{"N":"3"},{"N":"7"} ] 
} 

È possibile aggiornare l'elenco con codice come il seguente:

UpdateItemRequest request = new UpdateItemRequest(); 
request.setTableName("myTableName"); 
request.setKey(Collections.singletonMap("hashkey", 
    new AttributeValue().withS("my_key"))); 
request.setUpdateExpression("list_append(:prepend_value, my_list)"); 
request.setExpressionAttributeValues(
    Collections.singletonMap(":prepend_value", 
     new AttributeValue().withN("1")) 
    ); 
dynamodb.updateItem(request);` 

È inoltre possibile aggiungere all'elenco invertendo l'ordine degli argomenti nella lista aggiungere espressione.

Un'espressione come: SET user.address.zipcode = :zip permetterebbe di affrontare un elemento JSON mappa combinato con attributo di espressione valori {":zip" : {"N":"12345"}}

+0

Tutte le idee se il valore che stavo aggiungendo era di per sé una mappa anziché un numero come nell'esempio sopra riportato – PUG

+1

UpdateItemRequest è stato sostituito con UpdateItemSpec – PUG

6

Base su esempi DynamoDB, anche questo lavoro (scala)

val updateItemSpec:UpdateItemSpec = new UpdateItemSpec() 
    .withPrimaryKey("hashkey", my_key) 
    .withUpdateExpression("set my_list = list_append(:prepend_value, my_list)") 
    .withValueMap(new ValueMap() 
     .withList(":prepend_value", "1")) 
    .withReturnValues(ReturnValue.UPDATED_NEW) 
println("Updating the item...") 
val outcome: UpdateItemOutcome = table.updateItem(updateItemSpec) 
println("UpdateItem succeeded:\n" + outcome.getItem.toJSONPretty) 
+0

Si prega di approfondire come questo codice risponde alla domanda (questa risposta era nella coda di revisione Late Answers). – JAL

+1

Base sulla risposta Ben Schwartz i Solo wat per fornire un altro modo di risolvere nello stesso modo in cui vengono eseguiti gli esempi di Amazon –