Можем ли мы одновременно запрашивать и удалять элемент в AWS DynamoDB? - PullRequest
0 голосов
/ 26 мая 2020

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

Итак, после того, как запрос ответит, в базе данных не будет таких заказов, поскольку они были удалены на go.

Пример рабочего процесса с 5 элементами (образец изображения элементов ниже) будет выглядеть так -

введите описание изображения здесь

  • Запрос запускает проверку, From = Kartik.
  • Запрос поступает на 1-й элемент (1000) и обнаруживает, что он соответствует условию.
  • Он захватывает элемент и удаляет его из таблицы. Теперь только ответ содержит этот элемент, а не таблицу.
  • Запрос переходит к другим элементам (1001 & 1002) и обнаруживает, что они не подходят под условие, поэтому не соответствует ' t даже захватывает их и не удаляет тоже.
  • Запрос находит 4-й элемент (1003), соответствующий условию. Итак, он фиксирует его в ответе и удаляет его из таблицы.
  • То же, что и выше для 5-го элемента (1004).

Теперь запрос завершается, и возвращает ответ, содержащий ТОЛЬКО 1-й, 4-й и 5-й элементы. Теперь, если я go и поищу их в DynamoDB, он вернет ошибку, потому что они были удалены оттуда.

Итак, я хочу, чтобы поток был таким. Есть ли шансы, что это возможно?

Любая помощь приветствуется! Спасибо!

Ответы [ 2 ]

3 голосов
/ 26 мая 2020

Вы можете выполнить операцию deleteItem для элемента и получить его старое значение (до удаления), установив: "ReturnValues": "ALL_OLD" в параметрах запроса.

To для удаления элемента необходимо указать его первичный ключ. поэтому вы можете удалить только один элемент. (в вашем случае From не кажется первичным ключом)

DeleteItem do c

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

BatchItem do c

0 голосов
/ 26 мая 2020

Два дня на удаление элемента

1) Включите DynamoDB Streams и выполните дополнительные действия с использованием лямбда https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html

2) Используйте методы API DeleteItem или BatchWriteItem для выполнения поиск и удаление. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.DeleteData.html#SQLtoNoSQL .DeleteData.DynamoDB

В обоих случаях требуется найти элемент по PartitionKey, PartitionKey + Range sort key.

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

Итак, чтобы выполнить запрос по этим элементам, есть способы сделать его эффективным:

1) предлагает сделать FROM в качестве ключа раздела и OrderID как ключ сортировки / диапазона (составной ключ)

FROM | Детали заказа

картик | картик # 1000

картик | kartik # 1003

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

Как использовать метод begin_with для первичного ключа в DynamoDB?

https://aws.amazon.com/blogs/database/using-sort-keys-to-organize-data-in-amazon-dynamodb/

Затем вы можете использовать операторы KeyConditionExpression, такие как begin_with в ключе Sort и оператор EQ для ключа Partition, и получить все записи.

...