使用嵌套地图更新DynamoDB项的正确示例

Gee*_*cks 5 php amazon-dynamodb

我一定在这里缺少一些简单的东西。该测试的目的是在现有Map中设置一个新元素。下面的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());
    }
}
Run Code Online (Sandbox Code Playgroud)

有人看到我要去哪里了吗?谢谢。

mko*_*bit 2

这是因为点被认为是属性名称的一部分。您应该使用 2 个表达式属性名称。从文档中:

\n\n
\n

但是,如果您决定改用表达式属性名称怎么办?\n 例如,如果您定义#mmmk为\n 的替代品,会发生什么情况MyMap.MyKey?DynamoDB 将返回空结果,\n 而不是预期的字符串。这是因为 DynamoDB 将表达式属性值中的点解释为属性名称中的字符。当 DynamoDB 计算表达式 attribute\n name 时#mmmk,它​​确定MyMap.MyKey引用标量\n attribute\xe2\x80\x94,这不是预期的。

\n\n

正确的方法是定义两个表达式属性名称,每个属性名称对应文档路径中的每个元素:

\n\n
    \n
  • #mm \xe2\x80\x94 MyMap

  • \n
  • #mk \xe2\x80\x94 MyKey

  • \n
\n\n

然后您可以使用以下投影表达式:

\n\n
    \n
  • #mm.#mk
  • \n
\n
\n