Не удается обновить элемент в DynamoDB для синтаксиса UpdateExpression - PullRequest
0 голосов
/ 06 марта 2020

Данные моей таблицы выглядят так:

{
  "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_id имеет alpha-rocket, image_val имеет 284_454_53.0.0 и image имеет Mango/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 голосов
/ 06 марта 2020

Вы не можете обновить строку в списке путем сопоставления строки. Если вы знаете его индекс, вы можете заменить значение строки на индекс:

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

Я бы также рассмотрел возможность установки различных значений в различные «строки» в таблице и использование запросов для построения объектов.

...