list_append在Map中导致重复。如果list_append要求DynamoDB中的现有密钥

时间:2016-11-05 21:42:05

标签: java amazon-web-services amazon-dynamodb

在java中的以下代码中,我试图将一个项“test.com”附加到名为“daily”的Map字段中。当我运行此代码时,它只是为Map添​​加了一个重复的密钥。

Map<String,String> atrVal = new HashMap<String,String>();
                atrVal.put("test.com", json);
                UpdateItemSpec updateItemSpec = new UpdateItemSpec()
                        .withPrimaryKey("id", Id)
                        .withUpdateExpression("set daily = list_append(daily , :r)")
                        .withConditionExpression("attribute_not_exists (daily.#k1)")
                        .withValueMap(new ValueMap()
                                .withList(":r", Arrays.asList(atrVal))

                                )
                        .withNameMap(new NameMap()
                                .with("#k1", "test.com"));
                table.updateItem(updateItemSpec);

attribute_not_exists应该阻止它这样做。任何想法,为什么它不工作。

1 个答案:

答案 0 :(得分:1)

由于MAP中有LIST,因此API需要列表的索引(如下所示)。在Java术语中,每日的数据类型为List<Map<String, String>>

当你只说“daily.stringvalue”(即每日。“test.com”)时,它找不到String值,因为LIST中存在一个对象(即MAP),而不仅仅是一个STRING值

"attribute_not_exists (daily[0].#k1)"

当给出索引时,它会搜索第一个元素中的键。

如果列表是List<String>,则可以选择使用CONTAINS。但是,由于模型的复杂性,它无法使用。

  

列表支持CONTAINS:评估“a CONTAINS b”时,“a”   可以是一个清单;但是,“b”不能是集合,地图或列表。