我们可以同时查询和删除 Amazon DynamoDB 中的项目吗?
Posted
技术标签:
【中文标题】我们可以同时查询和删除 Amazon DynamoDB 中的项目吗?【英文标题】:Can we query and delete item in Amazon DynamoDB at the same time? 【发布时间】:2020-05-26 12:52:57 【问题描述】:我们想要运行一个查询,其中所有返回的项目都被删除。更清楚地说,我们想要做的是运行一个查询,如果一个项目匹配条件,它应该包含在响应中,并从 Amazon DynamoDB 中删除。然后查询应该使用第二个选项。
因此,在查询响应后,数据库中将不存在此类订单,因为它们在旅途中被删除。
一个包含 5 个项目的示例工作流程(项目示例图片如下)如下所示 -
一个查询运行检查
From
= Kartik
。
查询出现在第 1 项 (1000
) 上并发现它与条件匹配。
它捕获该项目,并将其从表中删除。现在,只有响应包含此项,而不是表格。
查询移动到更多项目 (1001
& 1002
) 并发现它们不符合条件,因此它甚至不捕获它们,也不会删除。
查询找到与条件匹配的第 4 项 (1003
)。因此,它会在响应中捕获它,并将其从表中删除。
第 5 项同上 (1004
)。
现在,查询完成,并返回仅包含第 1、4 和 5 项的响应。现在,如果我在 DynamoDB 中查找它们,它会返回错误,因为它们已从那里删除。
所以,这就是我想要的流程。这有可能做到吗?
感谢任何帮助!谢谢!
【问题讨论】:
【参考方案1】:您可以对项目执行 deleteItem 操作,并通过在请求参数中设置:"ReturnValues": "ALL_OLD" 来获取其旧值(删除前)。
要删除项目,您必须指定其主键。所以你只能删除一项。 (在您的情况下,From 似乎不是主键)
DeleteItem doc
您可以在 batchWriteItem 操作中执行删除以一次处理多个项目。但请注意,batchWriteItem 不是原子的,即某些删除操作可能会失败,您可以在 batchWriteItem 的响应中找到它们。
BatchItem doc
【讨论】:
【参考方案2】:正如doc 提到的那样,作为 reda la 答案的附加细节:
中指定的各个 PutItem 和 DeleteItem 操作 BatchWriteItem 是原子的;但是 BatchWriteItem 整体上不是。
因此,如果您只想删除 dynamodb 中的多个项目,您可以使用 BatchWriteItem 原子地执行此操作。
【讨论】:
【参考方案3】:两天后删除项目
1) 启用 DynamoDB 流并使用 lambda 执行其他活动 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html
2) 使用 DeleteItem 或 BatchWriteItem api 方法进行搜索和删除。 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.DeleteData.html#SQLtoNoSQL.DeleteData.DynamoDB
这两种情况都需要通过 PartitionKey , PartitionKey+Range 排序键来查找item。
OrderID 不是合适的主键,因为您想通过 From Column 查找项目。此外,此处不提供“扫描”选项。
所以要对这些项目进行查询, 有一些方法可以提高效率:
1) 建议将 FROM 作为分区键,将 OrderID 作为排序/范围键(复合键)
来自 |订单详情
卡提克 | kartik#1000
卡提克 | kartik#1003
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html
How can I Use begins_with method on primary key in DynamoDB?
https://aws.amazon.com/blogs/database/using-sort-keys-to-organize-data-in-amazon-dynamodb/
然后您可以使用 KeyConditionExpression 运算符,例如 Sort 键上的 begin_with 和分区键上的 EQ 运算符并获取所有记录。
【讨论】:
以上是关于我们可以同时查询和删除 Amazon DynamoDB 中的项目吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何将现有的关系数据库模型转换为适合无 sql 数据库的模型(如 Mongo DB 或 Amazon Dynamo DB)