摘要:在更新表達式中使用操作可從集中刪除元素。替換整個項目,而不是替換單個屬性。的行為與操作的行為類似如果項目位于表中,則更新項目,否則添加插入新項目。支持條件寫入,在此情況下,操作僅在特定的計算結果為時成功完成。
update (修改表中的數據)上一節介紹了DynamoDB 的查詢,本來計劃這一節介紹使用索引的查詢,不過隨機看到了更新操作,就先寫更新操作吧
SQL 語言提供用于修改數據的 UPDATE 語句。DynamoDB 使用 UpdateItem 操作完成類似的任務。
SQL在 SQL 中,可使用 UPDATE 語句修改一個或多個行。SET 子句為一個或多個列指定新值,WHERE 子句確定修改的行。示例如下:
UPDATE Music SET RecordLabel = "Global Records" WHERE Artist = "No One You Know" AND SongTitle = "Call Me Today";
如果任何行均不匹配 WHERE 子句,則 UPDATE 語句不起作用。
DynamoDB在 DynamoDB 中,可使用 UpdateItem 操作修改單個項目。
API 語法如下:
{ "AttributeUpdates": { "string" : { "Action": "string", "Value": { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } } }, "ConditionalOperator": "string", "ConditionExpression": "string", "Expected": { "string" : { "AttributeValueList": [ { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } ], "ComparisonOperator": "string", "Exists": boolean, "Value": { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } } }, "ExpressionAttributeNames": { "string" : "string" }, "ExpressionAttributeValues": { "string" : { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } }, "Key": { "string" : { "B": blob, "BOOL": boolean, "BS": [ blob ], "L": [ "AttributeValue" ], "M": { "string" : "AttributeValue" }, "N": "string", "NS": [ "string" ], "NULL": boolean, "S": "string", "SS": [ "string" ] } }, "ReturnConsumedCapacity": "string", "ReturnItemCollectionMetrics": "string", "ReturnValues": "string", "TableName": "string", "UpdateExpression": "string" }
參數說明:
Key: 主鍵,用于定位項目
TableName:表名 (最小 3. 最大 255)
Expected:
AttributeUpdates: 遺留參數,已廢棄
ConditionalOperator: 遺留參數,已廢棄
ConditionExpression:條件表達式(僅在特定 ConditionExpression 的計算結果為 true 時成功完成)
ExpressionAttributeNames:條件表達式的名稱的別名,比如 date 為保留字,可用別名定義為 #d
ExpressionAttributeValues:條件表達式的值
ReturnConsumedCapacity:顯示使用的寫入容量單位數
TOTAL 會返回由表及其所有global secondary index占用的寫入容量;
INDEXES 僅返回由global secondary index占用的寫入容量;
NONE 表示您不需要返回任何占用容量統計數據。
ReturnValues: 更新后返回的數據.
NONE - 如果沒有特別說明,返回None (這個是默認值)
ALL_OLD - 按在進行更新之前的情況,返回整個項目。
ALL_NEW - 按在進行更新之后的情況,返回整個項目。
UPDATED_OLD - 按在進行更新之前的情況,僅返回更新的值。
UPDATED_NEW - 按在進行更新之后的情況,僅返回更新的值。
UpdateExpression:指定要修改的屬性以及這些屬性的新值,更新表達式還指定如何修改屬性。下面是更新表達式的語法摘要:
update-expression ::= SET set-action , ... | REMOVE remove-action , ... | ADD add-action , ... | DELETE delete-action , ...
更新表達式由多個部分組成。每個部分以一個 SET、REMOVE、ADD 或 DELETE 關鍵字開頭。您可在更新表達式中按任意順序包含其中任意部分。但是,每個部分關鍵字只能出現一次。您可以同時修改多個屬性。以下是更新表達式的一些示例:
SET list[0] = :val1
REMOVE #m.nestedField1, #m.nestedField2
ADD aNumber :val2, anotherNumber :val3
DELETE aSet :val4
以下示例顯示了帶有多個部分的單個更新表達式:
SET list[0] = :val1 REMOVE #m.nestedField1, #m.nestedField2 ADD aNumber :val2, anotherNumber :val3 DELETE aSet :val4
我們可以在更新表達式中使用任意屬性名稱,第一個字符是 a-z 或 A-Z,第二個字符(如果存在)是 a-z、A-Z 或 0-9。
如果屬性名稱不滿足此要求,則需要將表達式屬性名稱定義為占位符。更多信息參考(表達式屬性名稱)。
要在更新表達式中指定文本值,可以使用表達式屬性值。更多信息參考(表達式屬性值)。
在更新表達式中使用 SET 操作可將一個或多個屬性與值添加到項目。如果這些屬性已存在,則更新。還可以使用 SET 來加或減數字類型的屬性。對多個屬性執行 SET 操作,使用逗號分隔。
set語法如下:
set-action ::= path = value value ::= operand | operand "+" operand | operand "-" operand operand ::= path | function
path 元素是項目的文檔路徑。(比如項目中info 為字典 info 中 a 的路徑為info["a"])
operand 元素可以為項目的文檔路徑,或者為函數。
SET 操作支持以下函數:
if_not_exists (path, operand) - 如果項目在指定 path 中不包含屬性,則 if_not_exists 的求值結果為 operand;否則求值結果為 path。您可以使用此函數來避免覆蓋項目中已存在的屬性。
list_append (operand, operand) - 此函數的求值結果為列表,新元素將添加到列表中。新元素必須包含在列表中,例如要向列表中添加 2,操作數將成為 [2]。您可以通過反轉操作數的順序,將新元素附加到列表的開頭或結尾。
以下是在這些函數中使用 SET 操作的一些示例。
如果屬性已存在,則以下示例不執行任何操作;否則它會將屬性設置為默認值。
SET Price = if_not_exists(Price, 100)
以下示例將新元素添加到 FiveStar 評論列表。表達式屬性名稱 #pr 是 ProductReviews;屬性值 :r 是只包含一個元素的列表。如果列表之前有兩個元素 [0] 和 [1],則新元素將為 [2]。
SET #pr.FiveStar = list_append(#pr.FiveStar, :r)
以下示例將另一個元素添加到 FiveStar 評論列表中,但此時元素將附加到列表開頭的位置 [0] 處。列表中的所有其他元素將會移動一位。
SET #pr.FiveStar = list_append(:r, #pr.FiveStar)
在更新表達式中使用 REMOVE 操作可從項目中刪除一個或多個元素。要執行多個 REMOVE 操作,請使用逗號分隔。
下面是更新表達式中的 REMOVE 的語法摘要。唯一的操作數是您要刪除的屬性的文檔路徑:
remove-action ::= path
以下是使用 REMOVE 操作的更新表達式示例。從項目中刪除多個屬性:
REMOVE Title, RelatedItems[2], Pictures.RearView
對列表元素使用 REMOVE
當刪除現有列表元素時,剩余的元素將會移位。例如,考慮以下列表:
MyNumbers: { ["Zero","One","Two","Three","Four"] }
列表包含元素 [0]、[1]、[2]、[3] 和 [4]?,F在,我們使用 REMOVE 操作刪除兩個元素:
REMOVE MyNumbers[1], MyNumbers[3]
剩余的元素會向右移位,生成帶有元素 [0]、[1] 和 [2] 的列表,每個元素具有以下數據:
MyNumbers: { ["Zero","Two","Four"] }
如果您使用 REMOVE 來刪除超出列表中最后一個元素位置的不存在項目,則將不執行任何操作:也就是不刪除任何數據。例如,以下表達式對 MyNumbers 列表沒有任何效果:
REMOVE MyNumbers[11]
ADD 操作僅支持數字和集數據類型。一般而言,我們建議使用 SET 而不是 ADD。
在更新表達式中使用 ADD 可執行以下任一操作:
如果屬性尚不存在,則將新屬性及其值添加到項目。
如果屬性已存在,則 ADD 的行為取決于屬性的數據類型:
如果屬性是數字,并且添加的值也是數字,則該值將按數學運算與現有屬性相加。(如果該值為負數,則從現有屬性減去該值。)
如果屬性是集,并且您添加的值也是集,則該值將附加到現有集中。
要執行多個 ADD 操作,請使用逗號分隔。
在以下語法摘要中:
path 元素是屬性的文檔路徑。屬性必須為數字或集數據類型。
value 元素是要與屬性相加的值(對于數字數據類型),或者是要附加到屬性中的集(對于集類型)。
add-action ::= path value
以下是使用 add 操作的一些更新表達式示例。
以下示例對數字進行加運算。表達式屬性值 :n 是數字,此值將與 Price 相加。
ADD Price :n
以下示例將一個或多個值添加到 Color 集。表達式屬性值 :c 是字符串集。
ADD Color :c
DELETE 操作只支持集數據類型。
在更新表達式中使用 DELETE 操作可從集中刪除元素。要執行多個 DELETE 操作,請使用逗號分隔。
在以下語法摘要中:
path 元素是屬性的文檔路徑。該屬性必須是集數據類型。
value 元素是集中要刪除的元素。
delete-action ::= path value
以下示例使用 DELETE 操作從 Color 集中刪除元素。表達式屬性值 :c 是字符串集。
DELETE Color :cUpdateItem 示例如下:
{ TableName: "Music", Key: { "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression: "SET RecordLabel = :label", ExpressionAttributeValues: { ":label": "Global Records" } }
UpdateItem必須指定要修改的項目的 Key 屬性和一個用于指定屬性值的 UpdateExpression。
UpdateItem 替換整個項目,而不是替換單個屬性。
UpdateItem 的行為與“upsert”操作的行為類似:如果項目位于表中,則更新項目,否則添加(插入)新項目。
UpdateItem只能修改單個項目,如果要修改多個項目,則必須使用多個 UpdateItem 操作。
UpdateItem 支持條件寫入,在此情況下,操作僅在特定 ConditionExpression 的計算結果為 true 時成功完成。例如,除非歌曲的價格大于或等于 2.00,否則以下 UpdateItem 操作不會執行更新:
條件寫入要執行條件更新,請使用更新表達式以及條件表達式來執行 UpdateItem 操作。要繼續執行操作,條件表達式的求值結果必須為 true;否則操作將失敗。
假設您要將某項目的價格提高一定金額,如 :amt,但前提是結果不得超過最高價。為此,您可以計算當前允許提價的最高價,然后從最高價中減去提高的金額 :amt。將結果定義為 :limit,然后使用以下條件表達式:
條件表達式:Price <= :limit)
更新表達式:SET Price = Price + :amt
現在假設您要為項目設置前視圖圖片,不過前提是該項目還沒有任何圖片,不希望覆蓋任何現有元素。您可以使用以下表達式來執行操作:
更新表達式:SET Pictures.FrontView = :myUR
(假設 :myURL 是項目圖片的位置,例如 http://example.com/picture.jpg。)
條件表達式:attribute_not_exists(Pictures.FrontView)
{ TableName: "Music", Key: { "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression: "SET RecordLabel = :label", ConditionExpression: "Price >= :p", ExpressionAttributeValues: { ":label": "Global Records", ":p": 2.00 } }
UpdateItem 還支持原子計數器或類型為 Number 的屬性(可遞增或遞減)。原子計數器在很多方面都類似于 SQL 數據庫中的順序生成器、身份列或自遞增字段。
以下是一個 UpdateItem 操作的示例,它初始化一個新屬性 (Plays) 來跟蹤歌曲的已播放次數:
{ TableName: "Music", Key: { "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression: "SET Plays = :val", ExpressionAttributeValues: { ":val": 0 }, ReturnValues: "UPDATED_NEW" }
ReturnValues 參數設置為 UPDATED_NEW,這將返回已更新的任何屬性的新值。在此示例中,它返回 0(零)。
當某人播放此歌曲時,可使用以下 UpdateItem 操作來將 Plays 增加 1:
{ TableName: "Music", Key: { "Artist":"No One You Know", "SongTitle":"Call Me Today" }, UpdateExpression: "SET Plays = Plays + :incr", ExpressionAttributeValues: { ":incr": 1 }, ReturnValues: "UPDATED_NEW" }總結一下
UpdateItem 一次只能更新一個項目
UpdateItem 更新更新整個項目而不是只修改特點的值
UpdateItem 支持條件寫入
這一節我們介紹了DynamoDB 項目的更新操作,下一節我們將介紹項目的刪除操作(索引的查詢又要延后了。。
原文鏈接
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38520.html
摘要:使用操作一次刪除一個項目。在中,可使用語句刪除一個或多個行。子句確定要修改的行。必須指定項目的主鍵值。示例如下除了之外,還支持同時刪除多個項目的操作。支持條件寫入,在此情況下,操作僅在特定的計算結果為時成功完成。 上一篇介紹了DynamoDB 的更新,這一篇將會介紹項目刪除操作和dynamoab-py 從表中刪除數據 在 SQL 中,DELETE 語句從表中刪除一個或多個行。Dynam...
摘要:使用操作一次刪除一個項目。在中,可使用語句刪除一個或多個行。子句確定要修改的行。必須指定項目的主鍵值。示例如下除了之外,還支持同時刪除多個項目的操作。支持條件寫入,在此情況下,操作僅在特定的計算結果為時成功完成。 上一篇介紹了DynamoDB 的更新,這一篇將會介紹項目刪除操作和dynamoab-py 從表中刪除數據 在 SQL 中,DELETE 語句從表中刪除一個或多個行。Dynam...
閱讀 1437·2021-11-25 09:43
閱讀 2580·2021-09-24 10:30
閱讀 3659·2021-09-06 15:02
閱讀 3593·2019-08-30 15:55
閱讀 3300·2019-08-30 15:53
閱讀 1693·2019-08-30 15:52
閱讀 2142·2019-08-30 14:21
閱讀 2010·2019-08-30 13:55