簡體   English   中英

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

[英]How can I update a nested field in 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',
      }
    }

你沒有提到編程語言,所以我假設我習慣了: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
        }
    )

我已經測試了這兩個並且它們有效。

如果 map site已經存在,給定代碼工作正常,看到錯誤消息,看起來路徑site不存在。

我們可以在創建文檔期間創建空 map,然后輕松更新它或者我們可以在更新"set #site =:siteValue"期間創建 map

這是創建 map 的稍微修改的查詢。

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

這是 Java SDK V2 的示例,它將更新 root->nested->someValue

        Map<String, AttributeValue> attributeValues = new HashMap<>();
        attributeValues.put(":myValue", AttributeValue.builder().s(jsonString).build());

        UpdateItemRequest updateRequest = UpdateItemRequest.builder()
                .tableName("my_table_name")
                .key(keyToUpdate)
                .updateExpression("SET nested.someValue= :myValue")
                .expressionAttributeValues(attributeValues)
                .build();

        client.updateItem(updateRequest);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM