2

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

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

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

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

4

1 回答 1

5

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

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

(强调我的)

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

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

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

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

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

于 2013-06-30T12:09:45.660 回答