DynamoDB映射器条件保存无法进行新行更新

时间:2019-06-06 00:42:31

标签: amazon-dynamodb dynamodb-queries

假设我在DDB中有下表。一个哈希键(称为“名称”),一个范围键(称为“活动”)和一个属性(称为“日期”)

select regexp_replace(string("kkl'll"),'\'','')="kk";
false

我希望对此进行有条件的保存,以便添加新的“名称+活动”并在数据库中保持最新状态。因此,将两种可能性分解为

1)如果根据传递给保存的内容已经存在一个现有的hash + rangekey,我想检查条件表达式,如果失败则不进行更新。
2)如果它是一个新的hash + rangekey,我希望创建一个新行,而不检查我的条件表达式(因为表中没有要检查的值)

我尝试过的例子

|---------------------|------------------|------------------|
|       HashKey(S)    |     RangeKey(S)  |      Date(S)     |
|---------------------|------------------|------------------|  
|          Sam        |     Fishing      |      2019        |  
|---------------------|------------------|------------------|
|          Sam        |     Kayaking     |      2019        |  
|---------------------|------------------|------------------|
|          Peter      |     Kayaking     |      2019        | 
|---------------------|------------------|------------------|

当哈希+范围键已在表中时,此方法可以很好地进行条件检查和成功/通过,但是,如果我提供新的范围键,则条件检查似乎总是失败。

用于条件检查的堆栈跟踪对于向我解释问题不是很有用,但我的假设是即使对全新的行创建,条件检查也正在应用,因此失败了。

是否有一种方法可以使它在一个保存操作中工作,或者我需要先阅读,检查是否存在,如果是,然后不进行条件检查就进行保存,如果不进行条件检查就进行保存?

1 个答案:

答案 0 :(得分:0)

我能够利用Tawan上面的提示进行类似的操作。

final Map expectedAttributeSetupForConditionalUpdate = new HashMap();

expectedAttributeSetupForConditionalUpdate
  .put("name", new ExpectedAttributeValue().withExists(false));
expectedAttributeSetupForConditionalUpdate
  .put("activity", new ExpectedAttributeValue().withExists(false));
expectedAttributeSetupForConditionalUpdate
  .put("Date", new ExpectedAttributeValue(new AttributeValue().withS(date))
  .withComparisonOperator(ComparisonOperator.LE));

final DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression() .withExpected(expectedAttributeSetupForConditionalUpdate)
.withConditionalOperator(ConditionalOperator.OR);

我无法使用较新的Condition表达式,因为DynamoDB映射器在我所使用的版本中尚不支持它们。本质上,当该行不存在时,此方法会“通过”条件检查,但当该行存在时,则使用日期。