DynamoDB中的UpdateExpression语法更新项目失败

时间:2020-03-06 02:13:43

标签: amazon-dynamodb dynamodb-queries

我的表格数据如下所示

{
  "id": {
    "S": "alpha-rocket"
  },
  "images": {
    "SS": [
      "apple/value:50",
      "Mango/aa:284_454_51.0.0",
      "Mango/bb:291",
      "Mango/cc:4"
    ]
  },
  "product": {
    "S": "fruit"
  }
}

下面是我更新表的代码。我传递给函数的变量的值是product_idalpha-rocketimage_val284_454_53.0.0imageMango/aa:284_454_53.0.0。 我正在尝试将Mango/aa的值从284_454_51.0.0更新为284_454_53.0.0,但收到错误消息“更新表达式中提供的文档路径对于更新无效”

def update_player_score(product_id, image_val, image):  
    dynamo = boto3.resource('dynamodb')  
    tbl = dynamo.Table('<TableName>')  

    result = tbl.update_item(
          expression_attribute_names: {
            "#image_name" => "image_name"
          },
          expression_attribute_values: {
            ":image_val" => image_val,
          },
          key: {
            "product" => "fruit",
            "id" => product_id,
          },
          return_values: "ALL_NEW",
          table_name: "orcus",
          update_expression: "SET images.#image_val = :image_val",
        }

是否有一种方法可以更新Mango/aa的值或将完整字符串"Mango/aa:284_454_51.0.0"替换为"Mango/aa:284_454_53.0.0"

1 个答案:

答案 0 :(得分:0)

您无法通过匹配字符串来更新列表中的字符串。如果您知道它的索引,则可以用索引替换字符串的值:

SET images[1] = : image_val

似乎您想要的不是字符串列表,而是另一个映射。因此,您可以使数据看起来像这样,而不是看起来像它,这将使您可以进行所需的更新:

{
  "id": {
    "S": "alpha-rocket"
  },
  "images": {
    "M": {
      "apple" : {
        "M": {
          "value": {
            "S": "50"
          }
      },
      "Mango" : {
        "M": {
          "aa": {
            "S": "284_454_51.0.0"
          },
          "bb": {
            "S": "291"
          },
          "cc": {
            "S": "4"
          }
      }
    }
  },
  "product": {
    "S": "fruit"
  }
}

我还将考虑将不同的值放在表中的不同“行”中,并使用查询来构建对象。