2017-08-13 74 views
0

我有DynamoDB,并且想要尝试更新某些条目并插入不存在的条目。我当前的代码是这样的:如果不存在,DynamoDB-Java将写入更新

updateItemSpec = new UpdateItemSpec() 
       .withPrimaryKey(ITable.ID, 
       request.getID().getValue()) 
       .withUpdateExpression(updatedExpressionSetString) 
       .withNameMap(nameMap) 
       .withValueMap(valueMap) 
try { 
     table.updateItem(updateItemSpec); 
} 

凡updateExpression是:直到到达那里的主键不存在一个条目

SET supply.#var0 = 
if_not_exists(supply.#var0,:default) + :val0, 
date = :dateVal 

这一切的伟大工程。发生这种情况时该代码抛出异常:

在更新表达式提供的文件路径是更新无效(服务:AmazonDynamoDBv2;状态代码:400;错误代码:ValidationException;)

我的问题是:如何我是否需要更正此代码,以便它在到达主键时插入,当它到达已存在的主键时进行更新,而不需要额外的读取以检查它是否存在?

+0

你有没有试图用没有主键的表来运行这个? – efekctive

+0

那么表是空的默认情况下,但我仍然需要保持主键否则我得到一个_cannot有空的关键GetItem,DeleteItem,或UpdateItem error_ – MatthewO

+0

我的意思是尝试隔离问题。尝试一个简单的更新,如果它的工作,那么你知道问题是如果存在。我现在无法访问我的Java环境 – efekctive

回答

0

我记不得PK是强制性的。它是。从Java文档:

if_not_exists(路径,操作数) - 如果该项目不在指定的路径包含一个 属性,则if_not_exists计算结果为 操作数;否则,它评估路径。避免覆盖可能已经存在于 项目中的属性,您可以使用此功能 。

但这

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.UpdateData.html

状态是可能的。

该值似乎不是PK。 upsert是否在没有表达式的情况下在桌面上工作?

相关问题