Элемент обновления DynamoDB PHP

У меня есть простая небольшая таблица, которую я просто хочу обновить. Провел часы в документах и ​​тестировании, не могу понять.

Моя таблица:

|environment |who|
-------------------
|ax          |tom|

Первичный ключ находится в «среде»

Все, что я хочу сделать, это установить «кто» на «бен», где «среда» = «топор».

Я пробовал как устаревший способ ведения дел, так и способ выражения. Я также попробовал как нотацию квадратных скобок, которую AWS использует в своих документах, так и нотацию array() php. Ниже приведены некоторые из способов, которыми я пытался это сделать.

1:

$result = $client->updateItem(array(
    'ConditionExpression' => 'environment = :env',
    'ExpressionAttributeValues' => array(
        ':env' => array(
            'S' => 'environment'
        ),
        ':who' => array(
            'S' => $who
        )
    ),
    'Key' => array( // REQUIRED
        ':env' => array(
            'S' => $env
        )
    ),
    'ReturnValues' => 'UPDATED_NEW',
    'TableName' => 'areas',
    'UpdateExpression' => 'SET who = :who'
));

2:

$result = $client->updateItem([
    'ConditionExpression' => 'environment = :env',
    'ExpressionAttributeValues' => [
        ':env' => [
            'S' => 'environment'
        ],
        ':who' => [
            'S' => $who
        ]
    ],
    'Key' => [
        ':env' => [
            'S' => $env
        ]
    ],
    'ReturnValues' => 'UPDATED_NEW',
    'TableName' => 'areas',
    'UpdateExpression' => 'SET who = :who'
]);

3:

$result = $client->updateItem(array(
    'AttributeUpdates' => array(
        'who' => array(
            'Action' => 'PUT',
            'Value' => array(
                'S' => $who
            )
        )
    ),
    'Key' => array(
        'environment' => array(
            'S' => $env
        )
    ),
    'TableName' => 'areas'
));

Изменить: Я получаю сообщение об ошибке:

 SerializationException (client): Start of list found where not expected - {"__type":"com.amazon.coral.service#SerializationException","Message":"Start of list found where not expected"}'

Любая помощь в этом очень ценится.


person sj.meyer    schedule 14.01.2017    source источник
comment
Какие сообщения об ошибках вы получаете? Ваш пост читается как утверждение, а не вопрос. Какова точная проблема?   -  person Mark B    schedule 15.01.2017
comment
@MarkB Я обновил свой пост, чтобы включить сообщение об ошибке, которое я получаю. Я получаю ту же ошибку с каждым из способов, которыми я пытаюсь это сделать.   -  person sj.meyer    schedule 15.01.2017


Ответы (1)


Я столкнулся с подобной проблемой. Это код, который я использовал, и он работал.

$RegID = "abracadabra";
$tableName="DefaultDelivery";
$marshaler = new Marshaler();

$requested_delivery = '{"Packet0":{"PacketNo":"2","Quantity":"1000ml","Type":"Toned Milk"},"Packet2":{"PacketNo":"4","Quantity":"250ml","Type":"Toned Milk"}}';

$eav = $marshaler->marshalJson('
{
 ":RequestedDelivery" : '.$requested_delivery.'
}
');

$key = $marshaler->marshalJson('                                               
     {                                                                          
         "RegistrationID" : "'.$RegID.'"
     }                                                                          
');

$params = [
     'TableName' => "$tableName",
     'Key' => $key,
     'ExpressionAttributeValues' => $eav,
     'UpdateExpression' => 'SET RequestedDelivery = :RequestedDelivery',
     'ReturnValues' => 'UPDATED_NEW'
];

try {
    $result = $client->updateItem($params);
        echo "SUCCESS";
}
catch (DynamoDbException $e){
   echo "Unable to update Item : \n";
}
person Deepak Daniel    schedule 18.10.2017
comment
Я закрыл этот проект некоторое время назад, так как это был побочный проект для работы, и он никогда не набирал обороты. У меня больше нет ни кода, ни среды, в которой он работал. Я не уверен, что мне разрешено это делать, но я поверю вам на слово за решение и отмечу его как правильное. - person sj.meyer; 05.02.2018