Go语言 如何在DynamoDB UpdateItem中更新数组对象

jchrr9hc  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(115)

编辑问题:尝试更新map[]接口字段时出现错误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类型。

bxfogqkk

bxfogqkk1#

我知道这个问题是关于如何使用updateItem更新整个数组的。我也遇到过类似的问题(这就是我如何找到你的问题的原因),但我设法自己解决了它,因为没有太多关于使用DynamoDB更新数组的信息。我在完成时一直打开这个浏览器的选项卡,现在我可以提供一些有用的帮助:
所以,你想更新你的authors数组(沿着其他的,比如标题,描述和照片)。

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

我会首先运行一个for循环来正确Map更新的数据,因为数组中可能不止两个元素。

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);
     }

我希望这对你来说足够好了。对我来说很有效。

相关问题