DynamoDB预期条件

时间:2013-06-29 15:34:23

标签: amazon-dynamodb

如果我创建这样的PutItem请求会发生什么:

  {
    "Expected": 
        {
            "testAttribute" :
                {
                    "Exists": "false",
                }
        },
    "Item": 
        {
            "testAttribute" :
                {
                    "S": "testValue"
                }
        },
    "TableName": "TableName"
}

其中“testAttribute”不是主键的一部分。

DynamoDB会扫描表格以查看是否存在属性为“testAttribute”==“testValue”的项目? 如果没有,DynamoDB将如何确定“testAttribute”==“testValue”的存在? 我在文档中找不到任何描述它是如何工作的东西。

1 个答案:

答案 0 :(得分:4)

根据documentation of the PutItem action,您不得发出该请求。它说:

  

项目:属性名称/值对的映射,每个属性一个。 仅需要主键属性;您可以选择为项目提供其他属性名称 - 值对。

(强调我的)

每当您使用PutItem时,您必须为主键的每个属性提供一个值。

这样,您肯定会同意,DynamoDB检查您在Expected子句中定义的条件非常简单快速:不需要扫描,只需查看单个项目即可可以匹配请求。否则,正如您所指出的,DynamoDB需要执行全表扫描(它可能会非常慢,并且它们肯定会向您收取费用),或者它需要维护表中每个项目的一致索引,他们会向你收取用于存储它的SSD空间!

另请注意,期望子句的含义与您在问题中描述的略有不同。假设您修复了请求并添加了所有主键属性,请求意味着:

  

“如果此主键标识的项目不存在,请创建它;如果它确实存在且不包含名为 testAttribute 的属性,请将项目替换为其属性所描述的项目。此请求;如果项目确实存在且包含名为 testAttribute 的属性,则不执行任何操作“。

您的描述表明DynamoDB会检查 testAttribute 的值是否为 testValue ,但是当您使用Expected/Exists子句时不会发生这种情况。要实现您描述的效果,您需要使用Expected/Value子句,然后在该子句中指定您期望的值 - 为请求的Item属性中的属性指定的值如果要发生更新(或插入),则仅用于定义属性的新值。