我目前正在为亚马逊的回声点开发一项需要使用持久数据的技能。在为我的技能开发Web界面时遇到了一个问题,我无法轻松更新技能使用的DynamoDB表的mapAttr
列。
过去两天我一直试图解决这个问题,我到处寻找包括文档在内,但似乎找不到任何对我有用的东西。
这是我正在使用的代码:
$result = $client->updateItem([
'TableName' => 'rememberThisDBNemo',
'Key' => [
'userId' => [ 'S' => $_SESSION['userDataAsk'] ]
],
'ExpressionAttributeNames' => [
'#attr' => 'mapAttr.ReminderJSON'
],
'ExpressionAttributeValues' => [
':val1' => json_encode($value)
],
'UpdateExpression' => 'SET #attr = :val1'
]);
我尝试过很多不同的东西,所以这可能是完全错误的,但我发现的一切都没有用。
该表包含 2列, userId 和 mapAttr ,userId是字符串,mapAttr是地图。最初我以为它只是一个JSON字符串,但它不是那样的,因为当我尝试用JSON字符串直接更新它时,它会在Alexa读取时停止工作。
我只是尝试更新mapAttr的2个属性中的1个。那是ReminderJSON,这是一个字符串。
任何帮助将不胜感激。感谢。
答案 0 :(得分:0)
尝试像这样调用updateItem
show create view test_view;
但是,请注意,要使其正常工作,属性mapAttr必须已存在。如果没有,您将获得ValidationException $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'
]);
作为一种变通方法,您可能希望在params中添加The document path provided in the update expression is invalid for update...
,捕获可能的异常,然后执行另一个更新,添加新属性mapAttr:
ConditionExpression => 'attribute_exists(mapAttr)'