假设我在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 |
|---------------------|------------------|------------------|
当哈希+范围键已在表中时,此方法可以很好地进行条件检查和成功/通过,但是,如果我提供新的范围键,则条件检查似乎总是失败。
用于条件检查的堆栈跟踪对于向我解释问题不是很有用,但我的假设是即使对全新的行创建,条件检查也正在应用,因此失败了。
是否有一种方法可以使它在一个保存操作中工作,或者我需要先阅读,检查是否存在,如果是,然后不进行条件检查就进行保存,如果不进行条件检查就进行保存?
答案 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映射器在我所使用的版本中尚不支持它们。本质上,当该行不存在时,此方法会“通过”条件检查,但当该行存在时,则使用日期。