当前位置: 首页 > 知识库问答 >
问题:

对于UpdateExpression语法,在DynamoDB中更新项失败

闾丘鸣
2023-03-14

我的表格数据如下所示

{
  "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_idhasalpha rocketimage_valhas284_454_53.0.0imagehasMango/aa:284_454_53.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个答案

罗晨
2023-03-14

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

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"
  }
}

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

 类似资料:
  • 我试图更新DynamoDB表中的项目。我写的代码正在更新项目,但是当我添加一个标题为“源代码/目标”的列时,它会给出一个“验证异常”异常。 用于更新的代码- 我得到的错误是- 调用UpdateItem操作时发生错误(ValidationException):无效的UpdateExpression:语法错误;标记:\“/\”,靠近:\“源/目标” 这个怎么解决?

  • 问题内容: 我一直在尝试找出如何更新dynamoDB中的项目,但没有成功。 我知道如何添加和删除项目,但不更新。 这是我的代码: 问题答案: 看来您正在尝试使用Expression更新项目,在这种情况下,您不正确。无论是和用于占位符代替你的表达。 我想如果您想为某项设置属性,您的代码将类似于以下内容: 这将更新一个看起来像这样的项目: 对此:

  • 我目前在dynamodb表中有一个列表属性: 我想使用UpdateExpression向Recommensions属性添加新项 我设法将一个对象映射添加到推荐列表中,但当我想添加另一个对象映射时,它将替换推荐列表中的对象。 我还尝试使用外接程序UpdateExpression 但我得到了一个错误

  • 这看起来应该很简单,但我没有找到任何例子或留档。我有一个看起来像这样的Dynamodb表: 记录1:{姓名、电子邮件、项目[{product}、{item2}、{item3]} 记录2:(姓名、电子邮件、项目[{product}、{item2}、{item3]} 我需要能够更新items元素,即更新记录1中的item1对象。我可以通过硬编码list数组元素使用以下代码来实现这一点,但我不知道如何将

  • 在文档之后,我尝试创建一个update语句,该语句将更新或添加dynamodb表中的一个属性(如果不存在)。 我在试这个 我得到的错误是: 如果有人做了类似于我正在努力实现的事情,请分享例子。