我必须在这里遗漏一些简单的东西。此测试的目标是在现有Map中设置新元素。以下PHP测试函数可以正常更新项目,但不是将person属性(Map)中间初始值设置为“T”,而是创建一个名为“person.mi”的新顶级属性并将其设置为“T” ”
docs for Document Paths指定用于访问地图元素的点符号,所以....我不知道我错过了什么。
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());
}
}
有人知道我哪里错了吗?感谢。
答案 0 :(得分:2)
这是因为点被认为是属性名称的一部分。您应该使用2个表达式属性名称。来自documentation:
但是如果您决定使用表达式属性名称呢? 例如,如果要将
#mmmk
定义为a,会发生什么 替换MyMap.MyKey
? DynamoDB会返回一个空结果, 而不是预期的字符串。 这是因为DynamoDB解释了一个 将表达式属性值中的点作为一个字符 属性的名称。当DynamoDB评估表达式属性时 名称#mmmk
,它确定MyMap.MyKey
指的是标量 属性 - 这不是预期的。正确的方法是定义两个表达式属性 名称,文档路径中每个元素一个:
#mm — MyMap
#mk — MyKey
然后,您可以使用以下投影表达式:
#mm.#mk
答案 1 :(得分:0)
即使阅读完文档后,我也遇到了这个问题。这是一个实际的代码示例:
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。