【问题标题】:Storing JSON document in DynamoDB using PHP AWS SDK使用 PHP AWS SDK 在 DynamoDB 中存储 JSON 文档
【发布时间】:2015-09-05 07:31:31
【问题描述】:

我阅读了documentation,其中有使用 AWS 开发工具包将数据插入到 dynamicDB 表中的 PHP 示例。但是,这是针对表格数据的。我正在尝试插入 JSON 数据,即键值对,其中 value 是 JSON 文档。我该怎么做?

我尝试了文档中的以下代码,但除非 value 是数组,否则它不起作用。

<?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

【问题讨论】:

  • 记住规则#1,到目前为止你尝试了什么?
  • @Yahya Done ,更新问题

标签: php json amazon-web-services amazon-dynamodb aws-sdk


【解决方案1】:

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

【讨论】:

  • 谢谢,我将答案标记为已接受和赞成。我可以将其添加为字符串数据类型。但是,我认为将其存储为 JSON 文档,我必须使用 M (map) 并再次请求关联数组。我认为存储 JSON 字符串的最佳方法是存储为字符串。
  • 发现以上可以通过Marshalling API实现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多