aws-lambda - 使用排序键删除 DynamoDb

我在发电机 dB 表中有以下字段

event_on -- 字符串类型

user_id -- 数字类型

事件名称 -- 字符串类型

由于该表可能有 user_id 的多个记录,而 event_on 是可以唯一的单个字段,所以我将其设为主键和 user_id 作为排序键

现在我想删除一个用户的所有记录,所以我的代码是

response = dynamodb.delete_item(
            TableName=events,
            Key={
                "user_id": {"N": str(userId)}
            })

它抛出错误

Exception occured An error occurred (ValidationException) when calling the DeleteItem operation: The provided key element does not match the schema

无论如何也有删除范围

有人可以建议我应该如何处理 dynamodb 表结构以使这段代码工作

谢谢,

最佳答案

听起来您使用复合主键 对数据建模,这意味着您同时拥有分区键和排序键。下面是一些示例数据的示例。

在 DynamoDB 中,访问项(在 RDBMS 语言中也称为“行”)的最有效方法是指定完整 主键 ( getItem ) 或分区键 ( query) ).如果您想按任何其他属性搜索,则需要使用 scan手术。使用 scan 时要非常小心,因为它可能是一种访问数据的昂贵方式(在性能和金钱方面)。

关于删除,您有几种选择。

  1. deleteItem - 通过主键删除表中的单个项目。
  2. batchWriteItem - BatchWriteItem 操作在一个或多个表中放置或删除多个项目。对 BatchWriteItem 的单次调用最多可写入 16 MB 的数据,其中可包含多达 25 个放置或删除请求
  3. TimeToLive - 您可以利用 DynamoDB 的生存时间 (TTL) 功能删除不再需要的项目。请记住,TTL 仅将您的项目标记为删除,实际删除最多可能需要 48 小时。

为了有效地使用这些选项中的任何一个,您首先需要确定要删除的项目。因为您想单独使用排序键的值来获取数据,所以您有两个选择;

  1. 使用扫描 找到感兴趣的项目。这并不理想,但如果您无法更改数据模型,这是一种选择。
  2. 创建交换分区键和排序键值的全局二级索引 (GSI)。这种模式称为倒排索引。这将允许您识别所有具有给定 user_id 的项目。

如果您选择选项 2,您的数据将如下所示

这将允许您获取给定用户的所有项目,然后您可以使用我上面概述的方法之一删除这些项目。

https://stackoverflow.com/questions/66489826/

相关文章:

firebase - 从 Firebase 文档获取时间戳/创建日期,而不是手动保存?

java - 如何找到其中包含空元素的整数数组的最大元素的索引?

unity3d - 有没有办法在着色器中合并 Unity 中的纹理?

python - 如何链接在两个列表之间创建连接?

javascript - 创建给定字符串的指定副本的字符串

r - 在列标题和成对变量中嵌入数据的数据透视表

r - 按组保留所有变量的最后一个非缺失观察

amazon-web-services - AWS Elastic Beanstalk EFS 安装

javascript - 如何在 NEXT JS 中的路由之间传递状态?

c++ - SFINAE 无法正确判断方法是否存在