DynamoDb. Условная запись на Create. Проверьте, подал ли NotEqual (NE) - PullRequest
0 голосов
/ 24 апреля 2018

Скажем, я хочу сохранить / создать новый элемент в таблице DynamoDb, если и только если уже не существует какого-либо существующего элемента, который содержал бы referenceId, равный тому же значению, которое я установил.

В моем случае я хочу создать элемент с withReferenceId=123, если в таблице нет других withReferenceId=123.

referenceId не является первичным ключом!(Я не хочу, чтобы это было так)

Итак, код:

 val withReferenceIdValue = "123";
 val saveExpression = new DynamoDBSaveExpression();

    final Map<String, ExpectedAttributeValue> expectedNoReferenceIdFound = new HashMap();
    expectedNoReferenceIdFound.put(
            "referenceId",
            new ExpectedAttributeValue(new AttributeValue().withS(withReferenceIdValue)).withComparisonOperator(ComparisonOperator.NE)
    );
    saveExpression.setExpected(expectedNoReferenceIdFound);

    newItemRecord.setReferenceId(withReferenceId);

    this.mapper.save(newItemRecord, saveExpression); // do not fail..

Это, похоже, не работает.

В таблице referenceId=123 уже save() не происходит сбой.Я ожидал, что this.mapper.save завершится с ошибкой за исключением.

В: Как сделать так, чтобы он не работал при условии?

Я также проверил этот где они предлагают добавить вспомогательную таблицу (таблицу состояний транзакций) .. потому что кажется, что saveExpression работает только для первичного ключа / ключа раздела ... если так:

не уверен, почему существует такое ограничение.в любом случае, если это первичный ключ, нельзя создать дублирующийся элемент с тем же первичным ключом .. зачем создавать условия на первом месте.3-я таблица - это слишком много ... почему нет ни одного NE для того поля, которое я хочу использовать.Я могу создать индекс для этого поля.не ограничиваясь использованием только первичного ключа .. это то, что я имею в виду

ОБНОВЛЕНИЕ:

Код отображения моей таблицы:

@Data // I use [lombok][2] and it does generate getters and setters.
@DynamoDBTable(tableName = "MyTable")
public class MyTable {

    @DynamoDBHashKey(attributeName = "myTableID")
    @DynamoDBAutoGeneratedKey
    private String myTableID;
    @DynamoDBAttribute(attributeName = "referenceId")
    private String referenceId;
    @DynamoDBAttribute(attributeName = "startTime")
    private String startTime;
    @DynamoDBAttribute(attributeName = "endTime")
    private String endTime;
    ...
}

1 Ответ

0 голосов
/ 24 апреля 2018

Поправьте меня, если я ошибаюсь, но из:

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/dynamodb-dg.pdf

Условные записи По умолчанию операции записи DynamoDB (PutItem, UpdateItem, DeleteItem)безоговорочно: каждая из этих операций перезапишет существующий элемент с указанным первичным ключом

первичный ключ - это заставляет меня утверждать, что условная запись работает ТОЛЬКО с первичными ключами

-

Также есть попытка использовать транзакционный путь r / w из БД.Есть библиотека.Это событие не имеет репозитория maven: https://github.com/awslabs/dynamodb-transactions

В качестве альтернативы представляется способ использования 3-й таблицы транзакций с первичными ключами, которые должны сообщать вам, можете ли вы читать или писать в таблицу.(некрасиво), как мы ответили здесь: DynamoDBMapper сохраняет элемент, только если он уникален

Другая альтернатива, я полагаю (по замыслу): она предназначена для разработки ваших таблиц таким образом, чтобы вы использовали основнойключ как ваш бизнес-ключ, так что вы можете использовать его для условных записей .

-

Другой вариант: используйте Aurora:)

-

Другие варианты (расследование): https://aws.amazon.com/blogs/database/building-distributed-locks-with-the-dynamodb-lock-client/ - это мне тоже не нравится.потому что потенциально это создаст тайм-ауты для других, которые захотят создать новые элементы в этой таблице.

-

Другой вариант: жить с этим пусть дублирование происходит для создания элемента (не включаяпервичный ключ).И позаботьтесь об этом как о части «сборки мусора».Зависит от сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...