2016-01-22 5 views
2

Я использую SDK Java SDK для связи с DynamoDB. Я пытаюсь сделать обновление таблицы некоторых свойств, хранящихся на карте.Атрибуты карты не обновлены должным образом в Dynamo. Вместо этого добавляется новое поле.

Перед обновлением, у меня есть объект, который выглядит следующим образом:

{ 
    "myMap": { 
    "innerMap": {} 
    }, 
    "hashKeyName": "hashKeyValue" 
} 

Мой код выглядит следующим образом:

Table myTable = ...; 
myTable.updateItem("hashKeyName", "hashKeyValue", 
     new AttributeUpdate("myMap.innerMap.myKey").addNumeric(100)); 

После этого обновления, мой объект Динамо выглядит следующим образом (заметьте, что карта еще пуста):

{ 
    "myMap": { 
    "innerMap": {} 
    }, 
    "myMap.innerMap.myKey": 100, 
    "hashKeyName": "hashKeyValue" 
} 

Почему myMap.innerMap.myKey добавлен как отдельный Фиэль d вместо правильного набора на карте?

ответ

1

Причина этого в том, что использование AttributeUpdate считается унаследованной операцией, а использование ключей карты в качестве имен атрибутов не поддерживается. Правильное использование для использования выражения для обновления:

myTable.updateItem("hashKeyName", "hashKeyValue", 
     "ADD myMap.innerMap.myKey :val", null /* NameMap, see comment */, 
     new ValueMap().withNumeric(":val", 100)); 

Обратите внимание, что в приведенном выше выражении нет карты имени. Возможно, возникнет соблазн использовать ADD #name :val в качестве выражения для обновления, а затем предоставить карту имен для #name => myMap.innerMap.myKey. В этом случае эти выражения: не эквивалент. Когда в исходном выражении появляется ., он рассматривается как разделитель путей. Когда . появляется в значении NameMap, он не считается разделителем путей.

 Смежные вопросы

  • Нет связанных вопросов^_^