Amazon DynamoDB
开发人员指南 (API 版本 2012-08-10)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

步骤 6:更新新电影记录

Microsoft .NET 和 DynamoDB 教程的本步骤中,您将通过几种不同的方式更新新电影记录。

更改情节和评分和并添加男演员

DynamoDB_intro 中的 Main 函数将更改您在步骤 4 中添加的电影记录的情节和评分,该函数还向电影记录添加了男演员列表。适用于 .NET 的 AWS 开发工具包 中的文档模型不支持更新嵌套属性,例如 info 属性下的项目。因此,Main 使用低级别客户端 API 而不是文档模型 Table 方法。

它首先创建一个低级别 UpdateItemRequest 来进行此更改:

UpdateItemRequest updateRequest = new UpdateItemRequest() { TableName = movies_table_name, Key = new Dictionary<string, AttributeValue> { { partition_key_name, new AttributeValue { N = "2018" } }, { sort_key_name, new AttributeValue { S = "The Big New Movie" } } }, ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":r", new AttributeValue { N = "5.5" } }, { ":p", new AttributeValue { S = "Everything happens all at once!" } }, { ":a", new AttributeValue { L = new List<AttributeValue> { new AttributeValue { S ="Larry" }, new AttributeValue { S = "Moe" }, new AttributeValue { S = "Curly" } } } } }, UpdateExpression = "SET info.rating = :r, info.plot = :p, info.actors = :a", ReturnValues = "NONE" };

ReturnValues 设置为 NONE 可指定不应返回任何更新信息。但是,当 Main 随后等待 UpdatingMovie_async 时,它会将 report 参数设置为 true。这会导致 UpdatingMovie_asyncReturnValues 更改为 ALL_NEW,这意味着更新过的项目应完整地返回。

UpdatingMovie_async06_UpdatingItem.cs 文件中实施:

using System; using System.Threading.Tasks; using System.Collections.Generic; using System.Text; using Amazon.DynamoDBv2.Model; namespace DynamoDB_intro { public static partial class Ddb_Intro { /*-------------------------------------------------------------------------- * UpdatingMovie_async *--------------------------------------------------------------------------*/ public static async Task<bool> UpdatingMovie_async( UpdateItemRequest updateRequest, bool report ) { UpdateItemResponse updateResponse = null; operationSucceeded = false; operationFailed = false; if( report ) { Console.WriteLine( " -- Trying to update a movie item..." ); updateRequest.ReturnValues = "ALL_NEW"; } try { updateResponse = await client.UpdateItemAsync( updateRequest ); Console.WriteLine( " -- SUCCEEDED in updating the movie item!" ); } catch( Exception ex ) { Console.WriteLine( " -- FAILED to update the movie item, because:\n {0}.", ex.Message ); if( updateResponse != null ) Console.WriteLine( " -- The status code was " + updateResponse.HttpStatusCode.ToString( ) ); operationFailed = true;return ( false ); } if( report ) { Console.WriteLine( " Here is the updated movie informtion:" ); Console.WriteLine( movieAttributesToJson( updateResponse.Attributes ) ); } operationSucceeded = true; return ( true ); } } }

UpdatingMovie_async 等待低级别 DynamoDB Client.UpdateItemAsync 方法更新电影记录。如果更新成功,并且 report 参数为 trueUpdatingMovie_async 将显示更新后的电影记录。

当文档模型有一个显示文档内容的方便 Document.ToJsonPretty( ) 方法时,使用低级别属性值稍微有点复杂。00b_DDB_Attributes.cs 文件可提供访问和使用 AttributeValue 对象的方法的一些示例。

以原子方式递增电影评分

DynamoDB 支持计数器的原子更新,使您可以使用低级别更新方法来递增或递减现有属性的值,不会被其他写入请求干扰。(DynamoDB 中的所有写入请求的应用顺序与接收顺序相同。)

为了递增您刚刚创建的电影中的评分值,Main 函数在它在上一个更新中使用的 UpdateItemRequest 中进行了以下更改:

updateRequest.ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":inc", new AttributeValue { N = "1" } } }; updateRequest.UpdateExpression = "SET info.rating = info.rating + :inc";

然后,它再次等待 UpdatingMovie_async 进行更改。

尝试使用失败的条件进行更新

您还可以向更新请求添加一个条件,以便在不满足条件时不进行更新。

为了说明这一点,Main 函数对它刚刚用于递增电影评分的 UpdateItemRequest 进行了以下更改:

updateRequest.ExpressionAttributeValues.Add( ":n", new AttributeValue { N = "3" } ); updateRequest.ConditionExpression = "size(info.actors) > :n";

现在,仅当要更新的电影记录中的男演员超过 3 位时才能进行更新。由于仅列出了 3 位男演员,条件在 Main 等待 UpdatingMovie_async 时失败,更新没有执行。

了解更多信息

下一步

步骤 7:尝试有条件地删除电影