如何更新 DynamoDB 中的嵌套字段?

时间:2021-03-06 13:16:36

标签: amazon-web-services amazon-dynamodb

我定义了一个 DynamoDB 表,它有一个嵌套字段 site。我想更新下面代码中的字段 site.enable。但是当我运行更新命令时出现此错误:

<块引用>

ValidationException: 更新表达式中提供的文档路径对更新无效`

我应该怎么做才能解决问题?

{
      TableName: 'MyTable',
      Key: {
        id: '4b7020d2-2d19-4aeb-7f27e49d5bec',
        type: '80422149-c97d-4a1a-7bf20ef57056',
      },
      UpdateExpression: 'set #site.#siteenable= :siteenable',
      ExpressionAttributeValues: {
        ':siteenable': true,
      },
      ExpressionAttributeNames: {
        '#siteenable': 'enable',
        '#site': 'site',
      }
    }

2 个答案:

答案 0 :(得分:0)

您没有提到编程语言,所以我将假设我习惯使用:Python。

在 Python 中有两种方法可以做到这一点:

  1. 较低级别的客户端 API,它要求您按照 DynamoDB 的方式格式化数据
def enable_site_with_client():

    ddb = boto3.client("dynamodb")
    ddb.update_item(
        TableName=TABLE_NAME,
        Key={
            "PK": {"S": "SITE_ENTRY"}
        },
        UpdateExpression="SET #site.#enabled = :update_value",
        ExpressionAttributeNames={
            "#site": "site",
            "#enabled": "enabled"
        },
        ExpressionAttributeValues={
            ":update_value": {"BOOL": True}
        }
    )
  1. 更高级别的资源 API,允许您使用语言本机数据结构
def enable_site_with_resource():

    ddb = boto3.resource("dynamodb")
    ddb.Table(TABLE_NAME).update_item(
        Key={
            "PK": "SITE_ENTRY"
        },
        UpdateExpression="SET #site.#enabled = :update_value",
        ExpressionAttributeNames={
            "#site": "site",
            "#enabled": "enabled"
        },
        ExpressionAttributeValues={
            ":update_value": True
        }
    )

我已经测试了这两个并且它们有效。

答案 1 :(得分:0)

如果地图 site 已经存在,给定的代码工作正常,看到错误消息,看起来路径 site 不存在。

我们可以在创建文档的过程中创建空地图,然后轻松更新或 我们可以在更新"set #site = :siteValue"

期间创建地图

这是创建地图的稍微修改的查询。

const dynamodb = new AWS.DynamoDB();
let docClient = new AWS.DynamoDB.DocumentClient();

docClient.update(
  {
    TableName: "MyTable",
    Key: {
      id: "4b7020d2-2d19-4aeb-7f27e49d5bec",
      type: "80422149-c97d-4a1a-7bf20ef57056",
    },
    UpdateExpression: "set #site = :siteValue",
    ExpressionAttributeValues: {
      ":siteValue": { enable: true },
    },
    ExpressionAttributeNames: {
      "#site": "site",
    },
  },
  function (error, result) {
    console.log("error", error, "result", result);
  }
);