我有一个使用复合键
定义的DynamoDb表 $response = $this->dynamoDb->createTable([
...
'KeySchema' => [
[
'AttributeName' => 'product_code',
'KeyType' => 'HASH'
],
[
'AttributeName' => 'token',
'KeyType' => 'RANGE'
]
]
...
]);
我希望能够更新“product_code”=“X”和“created_at”< =“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
我应该使用哪个命令?非常感谢任何构建我的查询的帮助。
答案 0 :(得分:0)
以下内容摘自UpdateItem的AWS DynamoDB API参考:
对于主键,您必须提供所有属性。例如,使用简单的主键,您只需要为分区键提供值。对于复合主键,必须为分区键和排序键提供值。
在您的代码(更新项目部分)中,您只提供哈希键(token
)。您必须在ConditionExpression
属性中提供范围键(keysToUpdate
),因为您定义了一个复合键。
修改强>
(关于评论)
以下描述了UpdateItem的参数:
请求参数
...
<强>关键强>
要更新的项目的主键。每个元素都包含一个 属性名称和该属性的值。
对于主键,您必须提供所有属性。对于 例如,使用简单的主键,您只需提供一个值 对于分区键。对于复合主键,您必须提供 分区键和排序键的值。
类型:String to AttributeValue对象图
必填:是
...
如您所见,UpdateItem操作需要主键。 因此,您无法使用辅助索引将UpdateItem指向要更新的项集合。
但是,您可以通过辅助索引query表,并收集结果项的主键,例如在数组keyToUpdate
中。
然后,您可以更新所需的项目,其键位于{{1}}。