DynamoDB - UpdateItem,其中X <= Y.

时间:2016-01-12 16:33:41

标签: amazon-dynamodb

我有一个使用复合键

定义的DynamoDb表
        $response = $this->dynamoDb->createTable([
            ...
            'KeySchema' => [
                [
                    'AttributeName' => 'product_code',
                    'KeyType' => 'HASH' 
                ],
                [
                    'AttributeName' => 'token',
                    'KeyType' => 'RANGE' 
                ]
            ]
            ...
        ]);

我希望能够更新“product_code”=“X”和“created_at”&lt; =“Y”的所有记录。我认为它一定是可能的,但我有点难过。 updateItem方法需要完整的密钥,但我想要一个条件更新而不指定密钥。我的最新存根读为

        $response = $this->dynamoDb->updateItem([
            'TableName' =>  'products',
            'ExpressionAttributeValues' =>  [
                ':val1'    =>  ['N' => (string)$this->input['product_code']]
                ':val2'    =>  ['N' => (string)$this->product['created_at']['N']],
                ':val3'    =>  ['N' => (string)strtotime("now")],

            ],
            'ConditionExpression'   =>  'product_code = :val1 AND processed_at <= :val2',
            'UpdateExpression'      =>  'set processed_at = :val3'
        ]);

但生成的错误消息如下所示:

[Key] is missing and is a required parameter

我应该使用哪个命令?非常感谢任何构建我的查询的帮助。

1 个答案:

答案 0 :(得分:0)

以下内容摘自UpdateItem的AWS DynamoDB API参考:

  

对于主键,您必须提供所有属性。例如,使用简单的主键,您只需要为分区键提供值。对于复合主键,必须为分区键和排序键提供值。

在您的代码(更新项目部分)中,您只提供哈希键(token)。您必须在ConditionExpression属性中提供范围键(keysToUpdate),因为您定义了一个复合键。

修改

(关于评论)

以下描述了UpdateItem的参数:

  

请求参数

     

...

     

<强>关键

     

要更新的项目的主键。每个元素都包含一个   属性名称和该属性的值。

     

对于主键,您必须提供所有属性。对于   例如,使用简单的主键,您只需提供一个值   对于分区键。对于复合主键,您必须提供   分区键和排序键的值。

     

类型:String to AttributeValue对象图

     

必填:是

     

...

如您所见,UpdateItem操作需要主键。 因此,您无法使用辅助索引将UpdateItem指向要更新的项集合。

但是,您可以通过辅助索引query表,并收集结果项的主键,例如在数组keyToUpdate中。 然后,您可以更新所需的项目,其键位于{{1}}。