DynamoDB - условное размещение по количеству записей - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь добиться своего рода оптимистической блокировки в DynamoDB, где я вставляю новую запись, основываясь на количестве записей, существующих с данным ключом раздела (таблица использует составной ключ).

Конкретным контекстом будет книга, где каждый документ в книге представляет собой депозит или снятие и содержит такие вещи, как totalBalance, purchasedItem (ноль, если депозит), userId, createDateи т. д.

Идея состоит в том, что служба (асинхронная) будет извлекать количество записей главной книги для данного пользователя, а также их последнюю запись в начале своего рабочего процесса.Он будет выполнять несколько операций перед обновлением главной книги.Я бы хотел, чтобы последний шаг выполнял TransactWrite, когда проверка условия гарантирует, что для пользователя существует такое же количество записей в бухгалтерской книге, как и в начале.Если нет, процесс начинается заново.

Я знаю, что DynamoDB поддерживает условные проверки атрибутов для одной записи, но можно ли написать проверку условий, которая проверяет количество записей, возвращаемых запросом?

aws dynamodb query --table-name myLedger --key-condition-expression "userId = :u" --expression-attribute-values '{":u": {"S": "0123abcd"}}' --select "COUNT"

1 Ответ

1 голос
/ 05 июня 2019

Это невозможно.

DynamoDB работает только на уровне документов и не знает, сколько документов хранится под этим ключом раздела.Вы не можете понять это, не прочитав все документы, и нет никакой гарантии, что вы даже сможете сделать это за одну операцию, не говоря уже о способе, который можно использовать в выражении условия.

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

Если вы реорганизуете свою модель данных, чтобы все записи были в одном документе, выполнить это обновление атомарно через тривиальновыражение обновления.

...