【问题标题】:How to update array object in DynamoDB UpdateItem如何更新 DynamoDB UpdateItem 中的数组对象
【发布时间】:2021-04-24 19:58:17
【问题描述】:

编辑问题:尝试更新我的 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"
            }
          }
        }
      }

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

【问题讨论】:

  • 有什么问题?有什么错误吗?它似乎有效但实际上没有更新?还是什么?
  • 对不起,如果问题不清楚,我无法更新。尝试更新作为数组映射的作者字段时出现错误 400
  • edit您的帖子包含完整的报价,大概是在“AWS给出的错误对我来说不是那么清楚”行之后跨度>

标签: go amazon-dynamodb aws-sdk-go


【解决方案1】:

我了解问题在于如何使用 updateItem 更新整个数组。我遇到了类似的问题(这就是我发现你的问题的原因),但我设法自己解决了这个问题,因为无论如何用 DynamoDB 更新数组都没什么可找的。所以,当我完成它时,我保持这个浏览器的标签打开,现在我可以提供一些有用的帮助:

因此,您想要更新您的作者数组(以及其他内容,例如标题、描述和照片)。假设你的“作者”看起来像这样:

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 type number, must convert 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);
     }

我希望这对你来说已经足够好了。它对我有用。

【讨论】:

  • 暂时在浏览器中保持这个打开...
猜你喜欢
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多