AWS PHP SDK问题(DynamoDB)

Cam*_*ini 0 php amazon-web-services amazon-dynamodb

最近DynamoDB发布了文档类型(列表或地图).请参阅此处:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes 或此处:http://www.allthingsdistributed.com/2014/10/document-model-dynamodb html的

现在我试图在DynamoDB中存储以下数组

array("key"=>"value")
Run Code Online (Sandbox Code Playgroud)

我正在使用PHP SDK 2.7.0和2.7.2以及3.0.0 beta(尝试了所有那些解决我的问题,每次相同的问题).我下面的代码存储两个字符串完美的作品:

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"),
        ),
    )
));
Run Code Online (Sandbox Code Playgroud)

现在我试图存储一个简单的数组,其中包含Map数据类型而不是字符串:

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")),
        ),
    )
));
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:

致命错误:未捕获的Aws\DynamoDb\Exception\DynamoDbException:AWS错误代码:SerializationException,状态代码:400,AWS请求ID:8H9URPVBNPCTG4VALA62XXXX3NVV4KQNSO5AEMVJF66Q9ASUAYGX,AWS错误类型:客户端,AWS错误消息:预期为null,User-Agent:aws-sdk-在第91行的/path/aws2.7.0/Aws/Common/Exception/NamespaceExceptionFactory.php中抛出php2/2.7.0 Guzzle/3.9.2 curl/7.36.0 PHP/5.3.28

AWS PHP SDK 2.7.0及更高版本应支持Map和List类型:https://github.com/aws/aws-sdk-php/releases/tag/2.7.0

如何在DynamoDB中存储数组?是否可以使用当前的SDK - 或者他们是否需要发布更新以完全支持这些新数据类型?或者是我的代码中的问题?

我真的很感激任何意见或可能的解决方案.提前致谢!

Ray*_*Lin 8

在DynamoDB中,文档(列表或映射)的值应该是属性值.

'Item' => array(
    'messageId'      => array('S' => "test-message1"),
    'data'      => array('M' => array("key"=> 
                                          array('S' => "value"))),
    ),
)
Run Code Online (Sandbox Code Playgroud)

同样在列表中,您将拥有:

array('L' => array( 
           array('S' => "key"), array('S' => "value")));
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!