当项目可能不存在时DynamoDB 有条件删除

问题描述 投票:0回答:1

我尝试在 DynamoDB 中执行删除项目操作,条件如下:

  1. 如果具有给定主键 (PK) 的项目不存在,则删除操作应该成功。

  2. 如果该项目存在,则只有在满足特定条件(例如属性 B 等于特定值)时才应将其删除。

  3. 整个操作必须在单个请求中处理(即没有额外的查询或事务)。

这是我一直在尝试的删除项目请求(示例):

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 在这种情况下评估条件的方式是否有限制?

任何指导或替代方法将不胜感激。预先感谢!

amazon-dynamodb nosql aws-sdk
1个回答
0
投票

我不确定,但您可以尝试将“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")},
    },
}

可能有用。

© www.soinside.com 2019 - 2024. All rights reserved.