BatchWriteItem中的PutRequests

时间:2014-05-05 13:54:02

标签: amazon-web-services amazon-dynamodb

来自AWS文档:

  

注意
  BatchWriteItem无法更新项目。要更新项目,请使用UpdateItem API。

但是,从这里的文档中不清楚的是他们的意思是"更新项目"。如果PutRequests中的项目是现有项目,是否会在正常的PutItem请求中按预期进行替换,还是会抛出异常?

2 个答案:

答案 0 :(得分:1)

他们的意思是你在batchWriteItems中没有updateItem动作,所以是的,你只能" put"正常投放的项目,如果项目存在,将被替换。请记住,batchWriteItem没有受到限制,因此,如果您的应用程序不知道预配置的吞吐量,那么您将面临错误。你也不能使用条件。

答案 1 :(得分:0)

我想以下示例将有所帮助。

假设此查询:

$response = $client->batchWriteItem(array(
"RequestItems" => array(
    "user" => array(
        array(
            "PutRequest" => array(
                "Item" => array(
                    "userId" => array(Type::NUMBER => 7),
                    "attr1" => array(Type::NUMBER => 1),
                    "attr2" => array(Type::NUMBER => 2),
                    "attr3" => array(Type::NUMBER => 3), 
                )
            ),
        )))));

这将创建一个包含 userId,attr1,attr2,attr3 的项目。 让我们说你执行以下batchWrite

$response = $client->batchWriteItem(array(
"RequestItems" => array(
    "user" => array(
        array(
            "PutRequest" => array(
                "Item" => array(
                    "userId" => array(Type::NUMBER => 7),
                    "temp1" => array(Type::NUMBER => 11),
                    "temp2" => array(Type::NUMBER => 22),
                )
            ),
        )))));

执行此查询后,Item(行)将是 userId,temp1,temp2 而不是 的用户id,temp1中,TEMP2,attR1位,attR2位,attr3

所以从技术上来说,他们是正确的,我们不能用来更新项目,因为它将创建新项目,使用相同的Hash Key替换旧项目(行)。

因此,如果您想更新项目,那么我们可以使用

            $params['temp1'] = array(
                'Action' => 'PUT',
                'Value' => array(
                    Type::NUMBER => 555
                )
            );
        }

            $response = $client->updateItem(array(
                "TableName" => "user",
                "Key" => array(
                    "userId" => array(
                        Type::NUMBER => 7
                    )
                ),
                "AttributeUpdates" => $params
                    )
            );

这将更新项目(行)并将 temp1 的值从1更改为555

希望这会有所帮助