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