Правильный пример обновления элемента DynamoDB с помощью вложенной карты

Я, должно быть, здесь упускаю что-то простое. Цель этого теста — установить новый элемент в существующей карте. Следующая функция тестирования PHP прекрасно работает для обновления элемента, но вместо установки среднего начального значения атрибута person (карты) на «T», она создает новый атрибут верхнего уровня с именем person.mi и устанавливает его на «T». ».

документы для путей документов укажите точечную запись для доступа к элементам карты, так что … я не знаю, что мне не хватает.

public function Z() {

$ddb = DynamoDbClient::factory(array('region' => 'us-east-1')); // EC2 role security

try {
$response = $ddb->updateItem(array(
"TableName" => "test",
"Key" => array("id" => array("N" => 1)),
"UpdateExpression" => "SET #fieldName = :value",
"ExpressionAttributeNames" => array("#fieldName" => "person.mi"),
"ExpressionAttributeValues" => array(":value" => array("S" => "T"))
));
} catch (Exception $e) {
throw new DDBException("Call to TestDDB->Z failed: " . $e->getMessage());
}
}

Кто-нибудь видит, где я иду не так? Благодарю.

4

Решение

Это потому, что точка считается частью имени атрибута. Вы должны использовать 2 имени атрибута выражения. От документация:

Но что, если вы решили использовать вместо этого имя атрибута выражения?
Например, что случилось бы, если бы вы должны были определить #mmmk как
замена для MyMap.MyKey? DynamoDB выдаст пустой результат,
вместо ожидаемой строки. Это потому, что DynamoDB интерпретирует
точка в значении атрибута выражения как символ в пределах
имя атрибута
. Когда DynamoDB оценивает атрибут выражения
название #mmmkэто определяет, что MyMap.MyKey относится к скаляру
атрибут — это не то, что было задумано.

Правильный подход состоит в том, чтобы определить два атрибута выражения
имена, по одному для каждого элемента в пути документа:

  • #mm — MyMap

  • #mk — MyKey

Затем вы можете использовать следующее выражение проекции:

  • #mm.#mk
2

Другие решения

Даже после прочтения документации у меня возникли проблемы с этим делом. Вот пример кода:

public function Z() {

$ddb = DynamoDbClient::factory(array('region' => 'us-east-1')); // EC2 role security

try {
$response = $ddb->updateItem(array(
"TableName" => "test",
"Key" => array("id" => array("N" => 1)),
"UpdateExpression" => "SET #fieldName.mi = :value",
"ExpressionAttributeNames" => array("#fieldName" => "person"),
"ExpressionAttributeValues" => array(":value" => array("S" => "T"))
));
} catch (Exception $e) {
throw new DDBException("Call to TestDDB->Z failed: " . $e->getMessage());
}
}

Разница между исходным и моим кодом заключается только в UpdateExpression и ExpressionAttributeNames.

Обратите внимание, что хотя я использую заполнитель для человека, я не использую заполнитель для mi.

0

По вопросам рекламы [email protected]