使用DynamoDBSaveExpression评估插入新的/更新的DDB条目

时间:2018-07-26 22:16:15

标签: java amazon-dynamodb

我的DynamoDB表如下:

ID -> String
status -> (READY, DONE, IN_PROGRESS, FAILED)
other attributes..

我保存到DDB的数据如下:

DDBClass class = new DDBClass();
class.setId("ID");
class.setStatus("READY");

DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();
Map expectedExpression = new HashMap();
List<AttributeValue> attributeValues = new ArrayList<AttributeValue>();
attributeValues.add(new AttributeValue(WorkStatus.READY.toString()));
attributeValues.add(new AttributeValue(WorkStatus.RUNNING.toString()));
expectedExpression.put(WorkLogDdbItem.WORK_STATUS_ATTR,  new ExpectedAttributeValue().withAttributeValueList(attributeValues).withComparisonOperator(ComparisonOperator.IN));
saveExpression.setExpected(expectedExpression); 
ddbMapper.save(class, expression, DynamoDBMapperConfig.DEFAULT);

我希望DynamoDBSaveExpression评估为: 如果该条目不存在,请插入DDB 如果该条目确实存在,则比较状态值,然后根据需要插入。我将withExists=true添加为ExpectedAttributeValue的一部分,但这给了我一个例外:

Caused by: com.amazonaws.services.dynamodbv2.model.AmazonDynamoDBException: One or more parameter values were invalid: Exists and ComparisonOperator cannot be used together for Attribute: workStatus (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: 3N44TOJ4CFAJQ3A0OSKUCI22ARVV4KQNSO5AEMVJF66Q9ASUAAJG) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1640) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1304) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1058) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.doInvoke(AmazonDynamoDBClient.java:3443) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke(AmazonDynamoDBClient.java:3419) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.executeUpdateItem(AmazonDynamoDBClient.java:3153) at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.updateItem(AmazonDynamoDBClient.java:3128) at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.doUpdateItem(DynamoDBMapper.java:853) at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$2.executeLowLevelRequest(DynamoDBMapper.java:593) at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.execute(DynamoDBMapper.java:732) at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.save(DynamoDBMapper.java:622)

我如何使用DynamoDBSaveExpression达到这种条件?

1 个答案:

答案 0 :(得分:0)

通过存在,您是说该记录已经存在于表中或检查是否为非空?如果是较晚版本,请使用

ExpectedAttributeValue expectedNotNull = new ExpectedAttributeValue()
                .withComparisonOperator(ComparisonOperator.NOT_NULL);

如果要检查表中是否已存在记录,则只能在主键上执行。

AFAIK,非键/非索引属性上的DynamoDBSaveExpression只能应用于更新,而不能用于插入。