Недавно 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")),
),
)
));
это приводит к следующей ошибке:
Неустранимая ошибка: Uncaught Aws \ DynamoDb \ Exception \ DynamoDbException: AWS
Код ошибки: SerializationException, Код состояния: 400, Идентификатор запроса AWS:
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 и выше должен поддерживать тип карты и списка: https://github.com/aws/aws-sdk-php/releases/tag/2.7.0
Как я могу хранить массивы в DynamoDB? Возможно ли это с текущими SDK, или им нужно выпустить обновление для полной поддержки этих новых типов данных? Или проблема в моем коде?
Буду очень признателен за любые комментарии или возможные решения. Заранее спасибо!
В 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")));
Надеюсь, это поможет!
Это в 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)',
]);