2016-01-22 48 views
2

我正在使用AWS 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值中时,它不被视为路径分隔符。