2014-10-27 119 views
0

最近DynamoDB發佈了文檔類型(列表或地圖)。在這裏看到:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes 或在這裏:http://www.allthingsdistributed.com/2014/10/document-model-dynamodb.htmlAWS PHP SDK問題(DynamoDB)

現在正在嘗試以下數組存儲在DynamoDB

array("key"=>"value") 

我使用PHP SDK 2.7.0和2.7.2和3.0.0的測試版(嘗試了所有那些解決我的問題,每次都是同樣的問題)。我下面哪個代碼存儲兩個字符串完美的作品

require ("aws2.7.0/aws-autoloader.php"); 
use Aws\DynamoDb\DynamoDbClient; 
$client = DynamoDbClient::factory(array(
       'key' => 'KEY', 
       'secret' => 'SECRET', 
       'region' => 'eu-west-1' 
)); 

$result = $client->putItem(array(
    'TableName' => 'requests-test', 
    'Item' => array(
     'messageId'  => array('S' => "test-message1"), 
     'data'  => array('S' => "message-data-here"), 
     ), 
    ) 
)); 

現在我想存儲與地圖數據類型的簡單數組,而不是字符串:

require ("aws2.7.0/aws-autoloader.php"); 
use Aws\DynamoDb\DynamoDbClient; 
$client = DynamoDbClient::factory(array(
       'key' => 'KEY', 
       'secret' => 'SECRET', 
       'region' => 'eu-west-1' 
)); 

$result = $client->putItem(array(
    'TableName' => 'requests-test', 
    'Item' => array(
     'messageId'  => array('S' => "test-message1"), 
     'data'  => array('M' => array("key"=>"value")), 
     ), 
    ) 
)); 

這將導致以下錯誤:

Fatal error: Uncaught Aws\DynamoDb\Exception\DynamoDbException: AWS Error Code: SerializationException, Status Code: 400, AWS Request ID: 8H9URPVBNPCTG4VALA62XXXX3NVV4KQNSO5AEMVJF66Q9ASUAYGX, AWS Error Type: client, AWS Error Message: Expected null, User-Agent: aws-sdk-php2/2.7.0 Guzzle/3.9.2 curl/7.36.0 PHP/5.3.28 thrown in /path/aws2.7.0/Aws/Common/Exception/NamespaceExceptionFactory.php on line 91

AWS PHP SDK 2.7.0及以上應支持地圖和列表類型:https://github.com/aws/aws-sdk-php/releases/tag/2.7.0

如何將數組存儲在DynamoDB中?目前的SDK還有可能 - 還是需要發佈更新以完全支持這些新的數據類型?或者是我的代碼中的問題?

我會很感激任何意見或可能的解決方案。提前致謝!

+0

關於這個新功能的更多信息,可以發現在aws博客上:http://aws.amazon.com/blogs/aws/dynamodb-update-json-and-more/ – 2014-10-27 17:44:26

回答

8

在DynamoDB中,文檔(列表或地圖)的值應該是屬性值。

在列表
'Item' => array(
    'messageId'  => array('S' => "test-message1"), 
    'data'  => array('M' => array("key"=> 
              array('S' => "value"))), 
    ), 
) 

同樣,你有這樣的:

array('L' => array( 
      array('S' => "key"), array('S' => "value"))); 

我希望這有助於!

+0

嗨雷蒙德。感謝您的回覆,它最終允許我在DynamoDB中存儲映射。但是,我正在根據地圖的INSIDE值查詢(掃描)數據庫時遇到一些問題。在這裏看到我的新問題:http://stackoverflow.com/questions/26678376/dynamodb-scan-with-multiple-nested-json-keys-php我猜我需要設置一些索引,或者我錯了嗎?感謝您的幫助,並希望我們能儘快完成這項工作! – 2014-10-31 15:40:55

0

這是在PHP

我一直用同樣的問題和思想有所這裏和那裏解釋,這是終於摸索出

$res =$this->dynamodb->updateItem([ 
      'TableName' => 'your_table', 
      'Key' => [ 
        'key1' => ['N' => $detail1, 
        'key2' => ['S' => $detail2, 
      "ExpressionAttributeNames" => ["#theList" => "my_list_iten_name"], 
      "ExpressionAttributeValues" => [ 
       ':empty_list' => ['L'=>[]], 
       ':addVal' => [ 
        'L' => [ 
         [ 
          'M' => [ 
           'val1' => ['S' => 'one'], 
           'val2' => ['S' => 'two!!!'], 
          ] 
         ], 
         [ 
          'M' => [ 
           'val1' => ['S' => 'one1'], 
           'val2' => ['S' => 'two2!!!'], 
          ] 
         ] 
        ] 
       ] 
      ], 
      'UpdateExpression' => 'SET #theList = list_append(if_not_exists(#theList, :empty_list), :addVal)', 
     ]);