Я, должно быть, здесь упускаю что-то простое. Цель этого теста — установить новый элемент в существующей карте. Следующая функция тестирования 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());
}
}
Кто-нибудь видит, где я иду не так? Благодарю.
Это потому, что точка считается частью имени атрибута. Вы должны использовать 2 имени атрибута выражения. От документация:
Но что, если вы решили использовать вместо этого имя атрибута выражения?
Например, что случилось бы, если бы вы должны были определить#mmmk
как
замена дляMyMap.MyKey
? DynamoDB выдаст пустой результат,
вместо ожидаемой строки. Это потому, что DynamoDB интерпретирует
точка в значении атрибута выражения как символ в пределах
имя атрибута. Когда DynamoDB оценивает атрибут выражения
название#mmmk
это определяет, чтоMyMap.MyKey
относится к скаляру
атрибут — это не то, что было задумано.Правильный подход состоит в том, чтобы определить два атрибута выражения
имена, по одному для каждого элемента в пути документа:
#mm — MyMap
#mk — MyKey
Затем вы можете использовать следующее выражение проекции:
#mm.#mk
Даже после прочтения документации у меня возникли проблемы с этим делом. Вот пример кода:
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.