2014-10-27 70 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)', 
     ]);