【问题标题】:How to set default value of a new attribute for earlier items in dynamodb table?如何为 dynamodb 表中的早期项目设置新属性的默认值?
【发布时间】:2017-01-15 22:03:49
【问题描述】:

我有一个只有哈希键的表,现在用例需要创建一个 GSI,并将 creationDate 作为范围键。

我通过在所有新项目中将 creationDate 值指定为数字来实现这一点。

但是该表已经有大约 5000 个条目没有为 creationDate 设置值,并且这些条目不包含在 GSI 上的扫描或查询操作的结果中。 作为对此的解决方案,我想为所有当前没有 creationDate 值的条目使用默认值。 我如何在 Java 中使用 dynamodbmapper 来做到这一点,或者有没有办法使用 AWS 控制台来做到这一点?

【问题讨论】:

    标签: java amazon-web-services amazon-dynamodb


    【解决方案1】:

    现有项目必须单独更新。

    • DynamoDB API 不允许在没有哈希键的情况下更新项目 使用 UpdateItemSpecDynamoDBMapper 的值
    • DynamoDB 没有一个功能可以在新建时默认某些值 使用 UpdateTableSpec
    • 将属性添加到表中

    如果给定哈希键的属性不存在,则更新项目:-

    如果属性已经存在,下面的例子什么也不做; 否则将属性设置为默认值。

        UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("orderId", "75246c41-02c7-48c4-8d4c-d202483e6d2b")
                .withReturnValues(ReturnValue.ALL_NEW).withUpdateExpression("set #createDate = if_not_exists (#createDate, :val1)")
                .withNameMap(new NameMap().with("#createDate", "createDate"))
                .withValueMap(new ValueMap().withNumber(":val1", 1));
    
        UpdateItemOutcome outcome = table.updateItem(updateItemSpec);
    

    【讨论】:

    • 有没有办法以类似的行更新表格?例如,我有一个包含主键和排序键的复合键的表。所以基本上我的表中现在有 2 个属性,但我想在我的表中添加第三个属性而不向表中添加任何项目。
    猜你喜欢
    • 2020-11-28
    • 2011-02-17
    • 1970-01-01
    • 2020-04-25
    • 2017-12-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多