我尝试在 DynamoDB 中执行删除项目操作,条件如下:
如果具有给定主键 (PK) 的项目不存在,则删除操作应该成功。
如果该项目存在,则只有在满足特定条件(例如属性 B 等于特定值)时才应将其删除。
整个操作必须在单个请求中处理(即没有额外的查询或事务)。
这是我一直在尝试的删除项目请求(示例):
deleteInput := &dynamodb.DeleteItemInput{
TableName: aws.String("YourTableName"),
Key: map[string]*dynamodb.AttributeValue{
"PK": {S: aws.String("PrimaryKeyValue")},
},
ConditionExpression: aws.String("attribute_not_exists(PK) OR #status = :statusValue"),
ExpressionAttributeNames: map[string]*string{
"#status": aws.String("Status"),
},
ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
":statusValue": {S: aws.String("Completed")},
},
}
_, err := dynamodbSvc.DeleteItem(deleteInput)
if err != nil {
if _, ok := err.(*dynamodb.ConditionalCheckFailedException); ok {
fmt.Println("Condition check failed: PK exists but Status is not Completed.")
} else {
fmt.Printf("Delete failed: %v\n", err)
}
} else {
fmt.Println("Delete succeeded.")
}
当项目存在并且条件满足或不满足时,这将按预期工作。但是,如果该项目不存在,我会收到 ConditionalCheckFailedException 而不是操作成功。
根据我的理解,当该项目不存在时,attribute_not_exists(PK) 条件应评估为 true,从而允许操作继续进行。但这似乎并没有发生。
如何确保在项目丢失时删除操作成功,同时在项目存在时仍然应用条件检查? DynamoDB 在这种情况下评估条件的方式是否有限制?
任何指导或替代方法将不胜感激。预先感谢!
我不确定,但您可以尝试将“PK”映射到表达式属性名称,然后使用它引用字符串“PK”?
因此,将顶部位更改为:
deleteInput := &dynamodb.DeleteItemInput{
TableName: aws.String("YourTableName"),
Key: map[string]*dynamodb.AttributeValue{
"PK": {S: aws.String("PrimaryKeyValue")},
},
ConditionExpression: aws.String("attribute_not_exists(#part_key) OR #status = :statusValue"),
ExpressionAttributeNames: map[string]*string{
"#status": aws.String("Status"),
"#part_key": aws.String("PK"),
},
ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
":statusValue": {S: aws.String("Completed")},
},
}
可能有用。