Предположим, у меня есть следующая таблица в DDB.Один хеш-ключ (давайте назовем его «Имя»), один ключ диапазона (давайте назовем его «Активность») и один атрибут (назовем его «Дата»)
|---------------------|------------------|------------------|
| HashKey(S) | RangeKey(S) | Date(S) |
|---------------------|------------------|------------------|
| Sam | Fishing | 2019 |
|---------------------|------------------|------------------|
| Sam | Kayaking | 2019 |
|---------------------|------------------|------------------|
| Peter | Kayaking | 2019 |
|---------------------|------------------|------------------|
Я хочу сделать условное сохранениепо этому так, что я хочу добавить новое «имя + активность» и поддерживать самую актуальную дату в БД.Таким образом, разбивка этих двух возможностей будет выглядеть следующим образом:
1) Если существует уже существующий хэш + ключ диапазона, основанный на том, что я передал в сохранение, я хочу проверить выражение условия и не обновлять его в случае сбоя.
2) Если это новый хэш + ключ диапазона, я хочу создать новую строку, а не проверять выражение моего условия (поскольку в таблице нет значений для проверки)
Примериз того, что я пробовал
public void methodToDoSave() {
final Map<String, ExpectedAttributeValue> expectedAttributes =
getExpectedAttributes(date);
final DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression()
.withExpected(expectedAttributes);
mapper.save(dbItem, saveExpression);
}
private Map<String, ExpectedAttributeValue> getExpectedAttributes(
final Date date){
final Map expectedAttributeSetupForConditionalUpdate = new HashMap();
expectedAttributeSetupForConditionalUpdate
.put("Date",new ExpectedAttributeValue(new AttributeValue().withS(date))
.withComparisonOperator(ComparisonOperator.LE));
return expectedAttributeSetupForConditionalUpdate;
}
Это прекрасно работает для выполнения условной проверки и успешного выполнения / прохода, когда ключ хэш + диапазона уже находится в таблице, однако, если я предоставлю новый ключ диапазона, условная проверка кажетсявсегда терпеть неудачу.
Трассировка стека для условной проверки не настолько полезна, чтобы объяснить мне проблему, но я предполагаю, что условная проверка применяется даже для совершенно новых созданий строк, поэтому она не работает.
Есть ли способ заставить это работать в одной операции сохранения или мне нужно будет сначала прочитать, проверить, если существует, если да, то сохранить без условных проверок, если нет сохранения с условными проверками?