【问题标题】:DynamoDb delete with sort keyDynamoDb 使用排序键删除
【发布时间】:2021-06-03 23:22:00
【问题描述】:

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

event_on -- 字符串类型

user_id -- 数字类型

事件名称 -- 字符串类型

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

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

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

报错

发生异常调用时发生错误(ValidationException) DeleteItem 操作:提供的关键元素与 架构

还有没有用范围删除

有人可以建议我如何使用 dynamodb 表结构来使此代码正常工作

谢谢,

【问题讨论】:

    标签: aws-lambda amazon-dynamodb boto3


    【解决方案1】:

    如您所见heredelete_item 需要主键而不是排序键。您必须进行全面扫描,并删除包含给定排序键的所有内容。

    【讨论】:

    • 是的,我知道,但没有扫描我试图弄清楚如何做到这一点
    【解决方案2】:

    如果您是通过主键和排序键创建的 DynamoDB 表,则应提供这两个值以从该表中删除项目。 如果在建表过程中主键没有添加排序键,则可以通过主键删除记录。

    我是如何解决的。

    实际上,我尝试在创建表时不添加排序键。我正在使用索引来排序和获取项目。

    【讨论】:

      【解决方案3】:

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

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

      在删除方面,您有几个选择。

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

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

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

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

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

      【讨论】:

      • 很好的答案!
      猜你喜欢
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 2022-08-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 2019-05-19
      相关资源
      最近更新 更多