Amazon dynamodb DynamoDB-更新项,其中X<;=Y

Amazon dynamodb DynamoDB-更新项,其中X<;=Y,amazon-dynamodb,Amazon Dynamodb,我有一个DynamoDb表,它定义了一个复合键 $response = $this->dynamoDb->createTable([ ... 'KeySchema' => [ [ 'AttributeName' => 'product_code', 'KeyType' => 'HASH'

我有一个DynamoDb表,它定义了一个复合键

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

我希望能够更新“product_code”=“X”和“created_at”中的所有记录,以下内容摘自AWS DynamoDB API参考中的UpdateItem:

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

在代码(更新项部分)中,您只提供哈希键(
product\u code
)。您必须在
条件表达式
属性中提供范围键(
标记
),因为您定义了复合键

编辑:

(关于评论)

下面介绍UpdateItem的参数:

请求参数

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

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

类型:字符串到AttributeValue对象映射

要求:是

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

但是,您可以通过辅助索引来创建表,并收集结果项的主键,例如在数组
keystupdate
中。
然后,您可以更新所需的项目,这些项目的键位于
keyToUpdate

中。编辑后,我的答案将稍有变化。请注意,您必须在
条件表达式
属性中提供范围键,在这种情况下-
标记
(以前是在创建的)问题是我不想使用标记,否则我将只检索一条记录(?),因为它创建了唯一的复合键。我需要根据产品代码和procesed_的值更新所有记录。我创建了一个二级索引,它使用产品代码并在处处理。但我不确定我的思路是否正确。
        $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