我正在嘗試使用條件在 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}但我仍然可以使用相同的電子郵件添加項目
1 回答

慕桂英4014372
TA貢獻1871條經驗 獲得超13個贊
這不是條件表達式的工作方式。DynamoDB 不會為匹配的電子郵件測試表中的所有項目。它正在測試此項目是否有匹配的電子郵件。如果存在這樣的項目,您的條件表達式僅應用于您在 put 調用中實際顯示其 ID 的項目。
請記住,PutItem 可用于插入新項,但也可用于替換現有項。如果不存在具有該 ID 的項目,我認為這里確實是這種情況,因為您正在編寫一個新的 ID,那么您的條件表達式將永遠不起作用。
將電子郵件作為主鍵,然后您可以使用條件表達式來測試是否存在并拒絕重復的電子郵件插入。使用帶有電子郵件屬性名稱的 attribute_not_exists 函數。
- 1 回答
- 0 關注
- 154 瀏覽
添加回答
舉報
0/150
提交
取消