2016-03-25 78 views
1

我想在某些條件下更新項目,然後我想知道UpdateItem返回時項目是否更新。dynamodb updateitem與條件表達式返回是否更新項目

該文檔似乎與我矛盾。

本頁內容:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html在「條件更新」示例中,它表示「所有項目的屬性,因爲它們出現在更新後,都會返回到響應中。」

在此頁面:https://godoc.org/github.com/aws/aws-sdk-go/service/dynamodb#UpdateItemOutput它說,屬性是「屬性值的地圖,因爲他們的的updateItem操作之前出現了」

我真的不希望任何的這些。我想要的是一個布爾,說是否有更新。

這是我的大腦是現在:

out, err := db.DynamoDB.UpdateItem(&dynamodb.UpdateItemInput{ 
    TableName: tableName, 
    Key: map[string]*dynamodb.AttributeValue{ 
     "KeyName": {S: aws.String(keyname)}, 
    }, 
    ExpressionAttributeNames: map[string]*string{ 
     "#lock": aws.String("Lock"), 
    }, 
    ExpressionAttributeValues: map[string]*string{ 
     ":now":  aws.String(compfmt(time.Now())), 
     ":promise": aws.String(compfmt(time.Now().Add(30 * time.Second))), 
    }, 
    ConditionExpression: aws.String("attribute_not_exist(#lock) OR :now > #lock"), 
    UpdateExpression: aws.String("SET #lock = :promise"), 
}) 
+2

你可以用'ALL_NEW'或'UPDATED_NEW'以獲得新屬性值。 – user1431317

+0

如果沒有更新,「UPDATED_NEW」的結果是否爲空?或者是否在操作後返回當前值? – voutasaurus

+4

你必須親自嘗試一下,但是如果文檔是正確的,在這種情況下,屬性貼圖應該是空的。 – user1431317

回答

1

一種方法是檢查Codeawserr

import "github.com/aws/aws-sdk-go/aws/awserr" 
func Lock()(bool, error) { 
    //Create value v 
    _, err := db.DynamoDB.UpdateItem(v) 
    if err != nil { 
     if ae, ok := err.(awserr.RequestFailure); ok && ae.Code() == "ConditionalCheckFailedException" { 
      return false, nil 
     } 
     return false, err 
    } 
    return true, nil 
} 
0

原來是我想要做的是檢查錯誤,看它是否包含字符串ConditionalCheckFailedException。要做到這一點

func Lock() (bool, error) { 
    ... 
    _, err := db.DynamoDB.UpdateItem(v) 
    if err != nil { 
    if strings.Contains(err.Error(), "ConditionalCheckFailedException") { 
     return false, nil 
    } 
    return false, err 
    } 
    return true, nil 
}