go - 具有许多属性的 UpdateItem

标签 go amazon-dynamodb aws-sdk insert-update

我正在尝试更新一个具有许多属性(超过 100 个)的项目。我可以看到有两种方法可以更新此项目。

PutItem:PutItem 可以更新项目,根据我的理解,我需要为每个请求发送所有 100 个属性,因为我使用结构来编码(marshal)和解封请求数据。如果我跳过任何字段,默认值将插入到表中。

UpdateItemInput:我们可以使用 UpdateItemInput 更新表格,如下 -

    svc := dynamodb.New(session.New())
    input := &dynamodb.UpdateItemInput{
    ExpressionAttributeNames: map[string]*string{
        "#AT": aws.String("AlbumTitle"),
        "#Y":  aws.String("Year"),
    },
    ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
        ":t": {
            S: aws.String("Louder Than Ever"),
        },
        ":y": {
            N: aws.String("2015"),
        },
    },
    Key: map[string]*dynamodb.AttributeValue{
        "Artist": {
            S: aws.String("Acme Band"),
        },
        "SongTitle": {
            S: aws.String("Happy Day"),
        },
    },
    ReturnValues:     aws.String("ALL_NEW"),
    TableName:        aws.String("Music"),
    UpdateExpression: aws.String("SET #Y = :y, #AT = :t"),
}

result, err := svc.UpdateItem(input)

这里我们需要为很多属性编写ExpressionAttributeNames,如果要更新的属性是动态的我应该如何处理。

我不确定哪种是处理更新的有效方法。请建议哪种方法更好,或者有其他方法来处理这种情况。

最佳答案

你是对的,PutItem 替换具有相同键的任何现有项目,因此如果您只想将一堆新属性值合并到现有项目中,则需要使用 UpdateItem .

正如您所说,确实有一个选择是使用 UpdateExpression句法。您需要创建一个类似 SET #a1 = :a1, SET #a2 = :a2, ... 的字符串并且还设置了这些 a1 等,但这并不是一个困难的编程练习。

另一个选项是代替 UpdateExpression ,使用旧的AttributeUpdates语法,带有一堆 PUT运营。这可能稍微容易一些(您只需构建一个 JSON 列表,而不是一个表达式加两个列表),但这两者都需要一些简单的编程。

关于go - 具有许多属性的 UpdateItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64366670/

相关文章:

amazon-dynamodb - 删除 Dynamodb 表中具有重复值的项目

amazon-web-services - DynamoDB 是否有锁定一行以供读取的机制?

node.js - JSON.stringify 大对象优化

pointers - 从 reflect.Value 中提取 uintptr

node.js - 如何在我的 node.js 应用程序中使用 AWS DAX

go - 如何在Go应用程序内的Elasticsearch中执行嵌套聚合?

javascript - 通过 Node SDK 在 AWS 上复制文件时“访问被拒绝”

java - Spark 是否允许对 DynamoDB 使用 Amazon Assumed Role 和 STS 临时凭证?

string - 为什么没有在字符串类型上定义字符串函数?

loops - 我的迭代函数有什么问题