【问题标题】:AWS PHP SDK issue (DynamoDB)AWS PHP 开发工具包问题 (DynamoDB)
【发布时间】:2014-12-22 23:01:19
【问题描述】:

最近 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")

我正在使用 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"),
        ),
    )
));

现在我正在尝试使用 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")),
        ),
    )
));

这会导致以下错误:

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

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

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

我非常感谢任何 cmets 或可能的解决方案。提前致谢!

【问题讨论】:

标签: php amazon-web-services amazon-dynamodb


【解决方案1】:

在 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")));

我希望这会有所帮助!

【讨论】:

  • 嗨,雷蒙德。感谢您的回复,它终于让我在 DynamoDB 中存储了一张地图。但是,我在根据地图内部的值查询(扫描)数据库时遇到了一些问题。在这里查看我的新问题:stackoverflow.com/questions/26678376/… 我猜我需要设置一些索引,还是我错了?感谢您的帮助,希望我们能尽快完成这项工作!
【解决方案2】:

这是在 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)',
        ]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多