Не удается обновить столбец карты таблицы DynamoDB

В настоящее время я разрабатываю навык для эхо-точки Amazon, который требует использования постоянных данных. Я столкнулся с проблемой при разработке веб-интерфейса для моего навыка, где я не мог легко обновить mapAttr столбец таблицы DynamoDB, используемой умением.

Я пытался решить это в течение последних 2 дней, я искал повсюду, включая документацию, но, похоже, не могу найти ничего, что могло бы мне помочь.

Это код, который я использую:

        $result = $client->updateItem([
'TableName' => 'rememberThisDBNemo',
'Key' => [
'userId' => [ 'S' => $_SESSION['userDataAsk'] ]
],
'ExpressionAttributeNames' => [
'#attr' => 'mapAttr.ReminderJSON'
],
'ExpressionAttributeValues' => [
':val1' => json_encode($value)
],
'UpdateExpression' => 'SET #attr = :val1'
]);

Я пробовал много разных вещей, так что это может быть абсолютно неправильно, но ничего, что я нашел, не сработало.

Стол имеет 2 колонки, Идентификатор пользователя а также mapAttr, userId — это строка, а mapAttr — это карта. Первоначально я думал, что это просто строка JSON, но это было не так, поскольку, когда я пытался обновить ее строкой JSON напрямую, она перестала работать при чтении Alexa.

Я только пытаюсь обновить 1 из 2 атрибутов mapAttr. Это ReminderJSON, который является строкой.

Любая помощь будет оценена. Благодарю.

0

Решение

Попробуйте вызвать updateItem, как это

    $result = $client->updateItem([
'TableName' => 'rememberThisDBNemo',
'Key' => [
'userId' => [ 'S' => $_SESSION['userDataAsk'] ]
],
'ExpressionAttributeNames' => [
'#mapAttr' => 'mapAttr',
'#attr' => 'ReminderJSON'
],
'ExpressionAttributeValues' => [
':val1' => ['S' => json_encode($value)]
],
'UpdateExpression' => 'SET #mapAttr.#attr = :val1'
]);

Тем не менее, имейте в виду, что для того, чтобы это работало, Атрибут mapAttr уже должен существовать. Если этого не произойдет, вы получите ValidationException, говоря The document path provided in the update expression is invalid for update...

В качестве обходного пути, вы можете добавить ConditionExpression => 'attribute_exists(mapAttr)' к вашим параметрам, перехватите возможное исключение, а затем выполните другое обновление, добавив новый атрибут mapAttr:

  try {
$result = $client->updateItem([
'TableName' => 'rememberThisDBNemo',
'Key' => [
'userId' => [ 'S' => $_SESSION['userDataAsk'] ]
],
'ExpressionAttributeNames' => [
'#mapAttr' => 'mapAttr'
'#attr' => 'ReminderJSON'
],
'ExpressionAttributeValues' => [
':val1' => ['S' => json_encode($value)]
],
'UpdateExpression' => 'SET #mapAttr.#attr = :val1'
'ConditionExpression' => 'attribute_exists(#mapAttr)'
]);

} catch (\Aws\Exception\AwsException $e) {
if ($e->getAwsErrorCode() == "ConditionalCheckFailedException") {
$result = $client->updateItem([
'TableName' => 'rememberThisDBNemo',
'Key' => [
'userId' => [ 'S' => $_SESSION['userDataAsk'] ]
],
'ExpressionAttributeNames' => [
'#mapAttr' => 'mapAttr'
],
'ExpressionAttributeValues' => [
':mapValue' => ['M' => ['ReminderJSON' => ['S' => json_encode($value)]]]
],
'UpdateExpression' => 'SET #mapAttr = :mapValue'
'ConditionExpression' => 'attribute_not_exists(#mapAttr)'
]);
}
}
0

Другие решения

Других решений пока нет …