2015-06-30 16 views
9

Değeri, bir Sayıdan Dizeye olan bir haritası olan bir DynamoDB özniteliğim var. Yeni bir anahtar-değer çifti koymaya çalışıyorum. Okuduğumdan bu mümkün görünüyor, ama nasıl olduğunu bilmiyorum.DynamoDB'de bir haritaya yeni bir anahtar/değer çifti nasıl eklenir? (java)

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

Ama örnek Haritaya yeni öğesindeki koyarak olduğuna inanmıyorum:

Ben çözüm için aşağıdaki bağlantıyı benzer olduğunu varsayalım. Birisi bana bir öğeyi bir haritaya nasıl ekleyebileceğimi gösterebilir mi?

Teşekkürler.

DÜZENLEME: Ben öğeyi almak istemiyorum

, lokal değişiklikleri yapın ve geri koyun. Eşzamanlı olarak etkileşime girebilecek birden fazla müşteri ile çalışıyorum (ve dinamo ile güncellemenin yarış koşullarının olmayacağını garanti ediyorum). .

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)" 

cevap

14

, sen #NUMBER bir harita girdisi ekleyerek bir hale getiren önceki `map` alan dinamosunun içindeki olmadığında

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; 

}

+0

Güzel bir yaklaşım, ama ne hakkında eklemek veya harita sütunundaki değerler eklemek? Yeni bir kaydı güncellemeye çalışırsanız, '' Güncelleme ifadesinde sağlanan belge yolu güncelleme için geçersiz '', daha önce bu alan yoksa, yeni bir Öğe oluşturmanın bir yolunu bulamıyorum, herhangi bir yardım? – user2976753

+1

"attribute_exists (map) ve attribute_not_exists (map. # Number)" konusundaki güncellemeyi yapın, ardından koşullu kontrol başarısız istisnasını değiştirin ve SET map =: m, attribute_not_exists (map) değerine farklı bir updateItem isteği deneyin. Unutmayın, her zaman öğeyi boş bir haritayla oluşturabilirsin! –

+0

teşekkürler. Haritanıza yeni bir özellik ve değer ekleyemediğim için aklımdan çıkıyordum. Özniteyi tabloya ekledi. sonra yukarıdaki örneğinizde haritanın yolunu nasıl belirttiğinizi (harita # sayı) gördüm. şimdi kodum çalışıyor! Teşekkürler. –

İlgili konular