猿问

DynamoDB PutItem 上的条件表达式

我正在尝试使用条件在 DynamoDB 上放置一个 intem,但不起作用。


我有一个用户表和一个属性 id 作为主键,属性名称必须是唯一的。


conditions := aws.String("NOT contains(email, :e_email)")

attributes := map[string]*dynamodb.AttributeValue{

    ":e_mail": &dynamodb.AttributeValue{

        S: &user.Email,

    },

}

input := &dynamodb.PutItemInput{

    Item:                item,

    TableName:           dynamoTable,

    ConditionExpression: conditions,

    ExpressionAttributeValues: attributes,

}

_, err = dynamo.PutItemWithContext(ctx1, input)

if err != nil {

    if erro, ok := err.(awserr.Error); ok {

        if erro.Code() == dynamodb.ErrCodeConditionalCheckFailedException {

            log.Println("User already exists")

            body, _ := json.Marshal(models.ErrUsuarioJaExiste)

            resp.StatusCode = models.ErrUsuarioJaExiste.CodigoHTTP

            resp.Body = string(body)

            return resp

        }

    }


    log.Println(err)

    resp.StatusCode = models.ErrInterno.CodigoHTTP

    body, _ := json.Marshal(models.ErrInterno)

    resp.Body = string(body)

    return resp

}

但我仍然可以使用相同的电子邮件添加项目


MMTTMM
浏览 114回答 1
1回答

慕桂英4014372

这不是条件表达式的工作方式。DynamoDB 不会为匹配的电子邮件测试表中的所有项目。它正在测试此项目是否有匹配的电子邮件。如果存在这样的项目,您的条件表达式仅应用于您在 put 调用中实际显示其 ID 的项目。请记住,PutItem 可用于插入新项,但也可用于替换现有项。如果不存在具有该 ID 的项目,我认为这里确实是这种情况,因为您正在编写一个新的 ID,那么您的条件表达式将永远不起作用。将电子邮件作为主键,然后您可以使用条件表达式来测试是否存在并拒绝重复的电子邮件插入。使用带有电子邮件属性名称的 attribute_not_exists 函数。
随时随地看视频慕课网APP

相关分类

Go
我要回答