使用嵌套映射更新DynamoDB项的正确示例

时间:2015-03-07 08:35:39

标签: php amazon-dynamodb

我必须在这里遗漏一些简单的东西。此测试的目标是在现有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());
    }
}

有人知道我哪里错了吗?感谢。

2 个答案:

答案 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。