DynamoDB 预期条件

mye*_*xec 2 amazon-dynamodb

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

  {
    "Expected": 
        {
            "testAttribute" :
                {
                    "Exists": "false",
                }
        },
    "Item": 
        {
            "testAttribute" :
                {
                    "S": "testValue"
                }
        },
    "TableName": "TableName"
}
Run Code Online (Sandbox Code Playgroud)

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

DynamoDB 会扫描表以查看是否有属性为 "testAttribute" == "testValue" 的项目吗?如果没有,DynamoDB 将如何确定 "testAttribute" == "testValue" 的存在?我在描述其工作原理的文档中找不到任何内容。

Bru*_*eis 5

根据PutItem操作文档,您不得发出该请求。它说:

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

(强调我的)

无论何时使用 ,都必须为主键的每个属性提供一个值PutItem

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

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

“如果此主键标识的项目不存在,则创建它;如果它确实存在并且不包含名为testAttribute的属性,则将该项目替换为在此请求中描述其属性的项目;如果该项目确实存在并且不包含包含一个名为testAttribute的属性,什么都不做”。

您的描述说 DynamoDB 会检查 testAttribute 的值是否testValue,但这不是您使用该Expected/Exists子句时发生的情况。为了达到你描述的效果,你需要使用Expected/Value子句,然后你在那个子句中指定你期望的值——Item请求的属性中为属性指定的值只是用来定义新的值属性,如果要发生更新(或插入)。