2015-06-30 15 views
9

Mam atrybut DynamoDB, którego wartością jest mapa z numeru do ciągu. Próbuję wstawić nową parę klucz-wartość. Z tego, co przeczytałem, wydaje się to możliwe, ale nie wiem jak.Jak umieścić nową parę klucz-wartość w mapie w DynamoDB? (java)

Zakładam, że rozwiązanie jest podobna do tej w poniższym linku:

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

Ale nie wierzę, jest na przykład wprowadzenie nowej pozycji na mapie. Czy ktoś może mi pokazać, jak umieścić przedmiot na mapie?

Dzięki.

EDIT:

Nie chcę, aby uzyskać pozycję, lokalnie dokonać zmian, i umieścić go z powrotem. Pracuję z wieloma klientami, którzy mogą współdziałać jednocześnie (i zakładam, że aktualizacja przez dynamo zapewnia brak warunków wyścigu).

Odpowiedz

14

z następujących argumentów UpdateItem można uzależnić dodanie wpisu na mapie, #NUMBER kiedy mapa # Numer nie istnieje na mapie już.

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

Nicea podejście, ale co, gdy nie ma poprzedniej 'pole map' wewnątrz dynamo? rzuca 'Ścieżka do dokumentu podana w wyrażeniu aktualizacji jest niepoprawna dla aktualizacji' jeśli próbujesz zaktualizować nowy rekord, nie mogę znaleźć sposobu na utworzenie nowego elementu, jeśli to pole wcześniej nie istniało, jakaś pomoc? – user2976753

+1

Należy zaktualizować aktualizację na "atrybut_istnieje (mapa) i atrybut_na_istnieje (numer mapy)", następnie sprawdź sprawdzanie warunkowe nie powiodło się wyjątek i wypróbuj inne żądanie updateItem, które ustawia mapę SET =: m, atrybut_na_istnieje (mapa). Pamiętaj, że zawsze możesz utworzyć element z pustą mapą! –

+0

dzięki. wychodziłem z głowy nie mogąc dodać nowego atrybutu i wartości do mapy. utrzymywało dodawanie atrybutu do tabeli. wtedy zobaczyłem, jak wskazałeś ścieżkę do mapy (numer mapy #) w powyższym przykładzie. teraz mój kod działa! dzięki. –

2

Odwiedź http://www.tryyourskill.com/aws/insert-or-append-key-values-map-in-dynamodb-using-java może pomóc z fragmentem kodu aby dodać lub dołączyć wartości w kolumnie mapy

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; 

}

Powiązane problemy