2015-09-04 125 views
2

我阅读documentation,其中有PHP示例可使用AWS SDK将数据插入到dynamicDB表中。但是这是表格数据。我试图插入JSON数据,即键值对,其中值是JSON文档。我怎么做 ?使用PHP AWS SDK在DynamoDB中存储JSON文档

我试图从文档中的下面的代码,但它不工作,除非值是一个数组。

<?php 

require '/home/ubuntu/vendor/autoload.php'; 

use Aws\DynamoDb\DynamoDbClient; 

$client = DynamoDbClient::factory(array(
    'profile' => 'default', 
    'region' => 'ap-southeast-1', 
    'version' => '2012-08-10' 
)); 

$id = "key"; 
$value = '{"subKey":"value"}' 


$result = $client->putItem(array(
    'TableName' => 'myTable', 
    'Item' => array(
     'key' => $value 
    ) 
)); 

它给了我下面的错误

Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Found 2 errors while validating the input provided for the PutItem operation: [Item][key] must be an associative array. Found string(1) "2" [Item][userId] must be an associative array. Found string(18) "{"subKey":"value"}"' in /home/ubuntu/vendor/aws/aws-sdk-php/src/Api/Validator.php:38 Stack trace: #0 /home/ubuntu/vendor/aws/aws-sdk-php/src/Middleware.php(78): Aws\Api\Validator->validate('PutItem', Object(Aws\Api\StructureShape), Array) #1 /home/ubuntu/vendor/aws/aws-sdk-php/src/AwsClient.php(208): Aws\Middleware::Aws\{closure}(Object(Aws\Command)) #2 /home/ubuntu/vendor/aws/aws-sdk-php/src/AwsClient.php(202): Aws\AwsClient->executeAsync(Object(Aws\Command)) #3 /home/ubuntu/vendor/aws/aws-sdk-php/src/AwsClient.php(167): Aws\AwsClient->execute(Object(Aws\Command)) #4 /var/www/html/dynamoDB.php(25): Aws\AwsClient->__call('putItem', Array) #5 /var/www/html/dynamoDB.php(25): Aws\DynamoDb\DynamoDbClient->putItem(Array) #6 {main} thrown in /home/ubuntu/vendor/aws/aws-sdk-php/src/Api/Validator.php on line 38 
+0

记住规则#1,你到目前为止试过了什么? – Yahya

+0

@Yahya完成,更新了问题 – SoulMan

回答

3

DynamoDB要求您与请求指定的AttributeValue类型。下面是https://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-dynamodb.html的例子:

$result = $client->putItem(array(
    'TableName' => 'errors', 
    'Item' => array(
     'id'  => array('N' => '1201'), 
     'time' => array('N' => $time), 
     'error' => array('S' => 'Executive overflow'), 
     'message' => array('S' => 'no vacant areas') 
    ) 
)); 

对于示例尝试将DynamoDB类型:

$result = $client->putItem(array(
    'TableName' => 'myTable', 
    'Item' => array(
     'key' => array('S' => $value) 
    ) 
)); 

其中 'S' 可以用 'N', 'B', 'SS' 所取代, 'NS','BS','M','L'或'BOOL'定义如下:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes

+0

谢谢,我标记答案为接受和upvoted。我可以将它作为字符串数据类型添加。不过,我认为将其存储为JSON文档,我必须使用M(map),并再次要求关联数组。我认为最好的方式来存储JSON字符串是存储为字符串。 – SoulMan

+0

发现上述可以通过编组API来实现 – SoulMan