go - 如何在DynamoDB UpdateItem中更新数组对象

标签 go amazon-dynamodb aws-sdk-go

编辑问题:尝试更新map [] interface字段时出现错误400。

使用UpdateItem时,我被困在更新DynamoDB中的数组对象上,特别是在我的数组对象上(在本例中为Authors字段)。

&awserr.requestError{awsError:(*awserr.baseError)(0xc000204140), statusCode:400, requestID:"QU2MMAJVDRM0JHJEPOE93VJPSVVV4KQNSO5AEMVJF66Q9ASUAAJG", bytes:[]uint8(nil)}

在具有相同结构的PutItem上使用时,我没有遇到任何问题。
我不确定我缺少什么,AWS发出的错误对我来说也不是很清楚。

结构:
type Book struct {
    Id          int            `json:":id"`
    Title       string         `json:":title"`
    Photo       Photo          `json:":photo"`
    Authors     []Author       `json:":authors"`
}

type Author struct {
    Id          int            `json:":id"`
    Name        string         `json:":name"`
}

我已经试过了
更新代码:
input := &dynamodb.UpdateItemInput{
        TableName:                 aws.String("books"),
        Key:                       key,
        UpdateExpression:          aws.String(updateExp),
        ExpressionAttributeValues: value,
    }

更新表达式:
"SET title = :title, photo = :photo, authors = list_append(authors, :authors)"

我也已经尝试过
authors = :authors

因为我打算每次都替换整个Authors的值,但是我似乎可以完成这项工作。

当我记录我的ExpressionAttributeValue时,它看起来像这样
ExpressionAttributeValues: {
        :authors: {
          L: [{
              M: {
                id: {
                  N: "1"
                },
                name: {
                  S: "Bob"
                }
              }
            },{
              M: {
                name: {
                  S: "Arthur"
                },
                id: {
                  N: "2"
                }
              }
            }]
        },
        :title: {
          S: "Jumanji"
        },
        :description: {
          S: "Jungle Book"
        },
        :photo: {
          M: {
            original: {
              S: "sample.jpg"
            }
          }
        }
      }

我已经测试过删除authors字段更新(以UpdateExpression根据可用数据进行调整的方式进行编码),并且所有其他字段更新都可以正常工作,所以我的问题实际上只是更新[] struct类型。

最佳答案

尽管您的问题有点令人困惑,但我认为问题在于如何使用updateItem更新整个数组。我遇到了类似的问题(这就是为什么我找到了您的问题),但是我设法自己解决了这个问题,因为无论如何,用DynamoDB更新数组并没有太多的选择。因此,我在完成该浏览器的选项卡时将其打开,现在我可以提供一些可能的有用帮助:

因此,您想更新您的authors数组(以及其他文件,例如标题,说明和照片)。假设您的作者看起来像这样:

const authors = [
  {
    id: 1,
    name: "Bob"
  },
  {
    id: 2,
    name: "Arthur"
  }
];

我将首先运行一个for循环,因为您可以在数组中包含两个以上的项目,以便正确地映射它以进行更新。像这样:
const authArray = []
for (const a of authors) {
  authArray.push({ M: { 
    id:   { N: a.id.toString() }, // if id is a number, transform to string
    name: { S: a.name }
  } });
}

然后,我们准备更新:
const params = {
    TableName: 'your-table-name',
    Key: { "UserID": { S: userID } },
    ExpressionAttributeValues: {
          ":au": { L: authArray },
          ":ti": { S: "Jumanji" },
          ":de": { S: "Jungle Book" },
          ":ph": { M: { original: { S: "sample.jpg" } }
    }, 
    ExpressionAttributeNames: {
          "#A": "authors",
          "#T": "title", 
          "#D": "description",
          "#P": "photo"
    }, 
    UpdateExpression: 
          "SET #A=:au, #T=:ti, #D=:de, #P=:ph",
    ReturnValues: 
          "ALL_NEW"
}

dynamoDB.updateItem(params, function (err, item) {
     if (err) {
        console.log('UPDATE FAILED! => ', err);
        cb(err);
     } else {
        console.log('SUCCESS UPDATE! => ', item);
        item = item.Attributes;
        cb(null, item);
     }

我希望这对你足够好。它为我工作。

关于go - 如何在DynamoDB UpdateItem中更新数组对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57611125/

相关文章:

go - Web.go 如何进行 http 重定向?

node.js - 无法使用 UpdateItem 从列表中删除元素

amazon-web-services - Lambda 和 DynamoDB : is not authorized to perform: dynamodb:Scan

go - 如何设置仅适用于我的 LAN 网络的 golang 服务器监听器

javascript - 推送者存在无法使用 angularjs 和 golang 获取成员

loops - 完成 2 个 goroutine 后删除文件

nosql - 如何在 DynamoDB 中处理多对多

amazon-web-services - 如何在 DetectEntitiesOutput 中仅过滤组织实体?

go - 如何在 S3 中保存数据流? aws-sdk-go 示例不起作用?

amazon-web-services - 使用AWS开发工具包Go从Fargate任务中的角色加载AWS凭证的正确方法是什么?