2017-03-14 2 views
0

현재 영구 데이터를 사용해야하는 Amazon의 에코 도트에 대한 기술을 개발 중입니다. 스킬에서 사용하는 DynamoDB 테이블의 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 열, userId를mapAttr을 가지고, userId를 문자열이며 mapAttr은 맵입니다. 원래 JSON 문자열 일 뿐이라고 생각했지만 JSON 문자열로 직접 업데이트하려고 시도했을 때 Alexa가 읽을 때 작업이 중단되는 것처럼 느껴지지 않았습니다.

mapAttr의 2 가지 속성 중 1 개만 업데이트하려고합니다. 그것은 문자열 인 ReminderJSON입니다.

도움을 주시면 감사하겠습니다. 감사.

답변

0

것은 그러나이

$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' 
    ]); 

처럼에 updateItem 호출 시도, 위해이 작업을하기에 있음을 유의하시기 바랍니다, 속성 mapAttr 이미 존재해야합니다.

: 그렇지 않은 경우, 당신은 ValidationException, 당신은 새로운 속성 mapAttr을, 당신의 PARAMS에 ConditionExpression => 'attribute_exists(mapAttr)'를 추가 가능한 예외를 캐치 한 다음 다른 업데이트에 추가를 수행 할 수있는 해결 방법으로 The document path provided in the update expression is invalid for update...

을 말하는거야

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

나는 두 가지 방법 모두 시도했지만 어느 것도 효과가없는 것으로 보인다. 많은 시도가 빈번하게 발생하지만 표준 200 HTTP 응답 코드 *를 반환합니다. 예외 처리를 위해 AwsException과 DynamoDbException 두 가지를 모두 시도했지만 예외는 없습니다. 뭐든지 잡아라. – CristianHG

+0

mapAttr 맵에서 ReminderJSON 항목을 업데이트하는 대신 새로운 최상위 속성'mapAttr.ReminderJSON' (예 : 이름에 점이 있음)을 작성한다는 사실을 알지 못했을 수 있습니까? 코드 스 니펫에 표시된 것과 같이 ''#attr '=>'mapAttr.ReminderJSON''을 지정하면 정확히 얻을 수 있기 때문입니다. 필자의 예에서는지도와 속성 이름이 다르게 지정되어 있습니다. – xtx