2015-06-30 9 views
9

Ho un attributo DynamoDB il cui valore è una mappa da Numero a stringa. Sto cercando di inserire una nuova coppia chiave-valore. Da quello che ho letto, sembra possibile, ma non so come.Come inserire una nuova coppia chiave-valore in una mappa in DynamoDB? (java)

presumo la soluzione è simile a quello nel link qui sotto:

How to update a Map or a List on AWS DynamoDB document API?

Ma non credo che l'esempio è sul mettere in un nuovo elemento a una mappa. Qualcuno potrebbe mostrarmi come inserire un oggetto in una mappa?

Grazie.

EDIT:

Non voglio ottenere l'oggetto, a livello locale apportare le modifiche, e rimetterlo. Sto lavorando con più clienti che potrebbero interagire contemporaneamente (e presumo che l'aggiornamento di dynamo assicuri che non ci saranno condizioni di gara).

risposta

14

con i seguenti argomenti a UpdateItem, si può condizionare l'aggiunta di una voce di mappa a #number quando mappa numero # non esiste nella mappa già:.

UpdateExpression = "SET map.#number = :string" 
ExpressionAttributeNames = { "#number" : "1" } 
ExpressionAttributeValues = { ":string" : "the string to store in the map at key value 1" } 
ConditionExpression = "attribute_not_exists(map.#number)" 
+0

approccio Nizza, ma che dire quando non c'è precedente 'campo map' all'interno dinamo? getta 'Il percorso del documento fornito nell'espressione di aggiornamento non è valido per l'aggiornamento' se si tenta di aggiornare un nuovo record, non riesco a trovare un modo per creare un nuovo elemento se il campo in precedenza non esiste, alcun aiuto? – user2976753

+1

Condiziona l'aggiornamento su "attribute_exists (map) e attribute_not_exists (map. # Number)", quindi visualizza l'eccezione di controllo condizionale non riuscita e prova una richiesta updateItem differente da SET map =: m, attribute_not_exists (map). Ricorda, puoi sempre pre creare l'oggetto con una mappa vuota! –

+0

grazie. Non pensavo di poter aggiungere un nuovo attributo e valore a una mappa. teneva aggiunto l'attributo al tavolo. poi ho visto come hai indicato il percorso per la mappa (mappa # numero) nell'esempio sopra. ora il mio codice funziona! Grazie. –

2

Visita http://www.tryyourskill.com/aws/insert-or-append-key-values-map-in-dynamodb-using-java può aiutare con il frammento di codice per aggiungere o aggiungere valori nella mappa delle colonne

public boolean insertKeyValue(String tableName, String primaryKey, String primaryKeyValue, String updateColumn,String newKey, String newValue){ 

//Configuration to connect to DynamoDB 
Table table = dynamoDB.getTable(tableName); 
boolean insertAppendStatus = false; 
try{ 
//Updates when map is already exist in the table 
UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey(primaryKey,primaryKeyValue).withReturnValues(ReturnValue.ALL_NEW). 
     withUpdateExpression("set #columnName." + newKey + " = :columnValue"). 
     withNameMap(new NameMap().with("#columnName", updateColumn)). 
     withValueMap(new ValueMap().with(":columnValue", newValue)).withConditionExpression("attribute_exists("+ updateColumn +")"); 

table.updateItem(updateItemSpec); 
insertAppendStatus = true; 
//Add map column when it's not exist in the table 
}catch (ConditionalCheckFailedException e) { 
    HashMap<String, String> map = new HashMap<>(); 
    map.put(newKey, newValue); 
    UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey(primaryKey,primaryKeyValue).withReturnValues(ReturnValue.ALL_NEW). 
     withUpdateExpression("set #columnName = :m"). 
      withNameMap(new NameMap().with("#columnName", updateColumn)) 
      .withValueMap(new ValueMap().withMap(":m", map)); 

    table.updateItem(updateItemSpec); 
    insertAppendStatus = true; 
} catch(Exception e){ 
    e.printStackTrace(); 
} 
return insertAppendStatus; 

}

Problemi correlati