Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

使用适用于 .NET 的 AWS 开发工具包对象持久化模型执行批量操作

批量写入:放置和删除多个项目

要通过单个请求在表中放置多个数据元或删除表中的多个数据元,请执行以下操作:

  • 执行 DynamoDBContextCreateBatchWrite 方法,创建 BatchWrite 类的实例。

  • 指定您要放置或删除的项目。

    • 要放置一个或更多项目,请使用 AddPutItemAddPutItems 方法。

    • 要删除一个或多个项目,您可以指定项目的主键或映射到您要删除的项目的客户端数据元。使用 AddDeleteItemAddDeleteItemsAddDeleteKey 方法指定要删除的项目列表。

  • 调用 BatchWrite.Execute 方法在表中放置指定的所有项目或将从表中删除所有指定的项目。

注意

使用对象持久化模型时,您可以批量指定任意数量的操作。但请注意,DynamoDB 限制了批量操作的数量以及批量操作中批的总大小。有关具体限制的更多信息,请参阅 BatchWriteItem。如果 API 检测到您的批量写入请求超出容许的写入请求数量或超出容许的最大 HTTP 负载大小,它就会将批划分为多个较小的批。此外,如果批量写入的响应返回了未处理的项目,API 将会就这些未处理的项目自动发送另一个批请求。

假设您已定义了一个 C# 类 Book 类,这个类映射到 DynamoDB 中的 ProductCatalog 表。以下 C# 代码段使用 BatchWrite 数据元上传两个项目,并从 ProductCatalog 表中删除一个项目。

Copy
DynamoDBContext context = new DynamoDBContext(client); var bookBatch = context.CreateBatchWrite<Book>(); // 1. Specify two books to add. Book book1 = new Book { Id = 902, ISBN = "902-11-11-1111", ProductCategory = "Book", Title = "My book3 in batch write" }; Book book2 = new Book { Id = 903, ISBN = "903-11-11-1111", ProductCategory = "Book", Title = "My book4 in batch write" }; bookBatch.AddPutItems(new List<Book> { book1, book2 }); // 2. Specify one book to delete. bookBatch.AddDeleteKey(111); bookBatch.Execute();

要向多个表中放置数据元,或删除多个表中的数据元,请执行以下操作:

  • 为每个类型创建 BatchWrite 类的实例,然后指定您要放置或删除的项目 (如前面的部分所述)。

  • 使用以下方法之一创建 MultiTableBatchWrite 的实例:

    • 针对您在之前步骤中创建的某个 BatchWrite 数据元执行 Combine 方法。

    • 通过提供一系列 BatchWrite 数据元创建 MultiTableBatchWrite 类型的实例。

    • 执行 DynamoDBContextCreateMultiTableBatchWrite 方法,并传入您的 BatchWrite 数据元列表。

  • 调用 MultiTableBatchWriteExecute 方法,这样会在各种表中执行指定的放置和删除操作。

假设您已定义了映射到 DynamoDB 中的 Forum 和 Thread 表的 Forum 和 Thread C# 类。同时,假设 Thread 类已启用版本控制。由于使用批量操作时不支持版本控制,因此,您必须明确停用版本控制 (如以下 C# 代码段所示)。该代码段使用 MultiTableBatchWrite 数据元执行多表更新。

Copy
DynamoDBContext context = new DynamoDBContext(client); // Create BatchWrite objects for each of the Forum and Thread classes. var forumBatch = context.CreateBatchWrite<Forum>(); DynamoDBOperationConfig config = new DynamoDBOperationConfig(); config.SkipVersionCheck = true; var threadBatch = context.CreateBatchWrite<Thread>(config); // 1. New Forum item. Forum newForum = new Forum { Name = "Test BatchWrite Forum", Threads = 0 }; forumBatch.AddPutItem(newForum); // 2. Specify a forum to delete by specifying its primary key. forumBatch.AddDeleteKey("Some forum"); // 3. New Thread item. Thread newThread = new Thread { ForumName = "Amazon S3 forum", Subject = "My sample question", KeywordTags = new List<string> { "Amazon S3", "Bucket" }, Message = "Message text" }; threadBatch.AddPutItem(newThread); // Now execute multi-table batch write. var superBatch = new MultiTableBatchWrite(forumBatch, threadBatch); superBatch.Execute();

要了解可工作的示例,请参阅示例:使用适用于 .NET 的 AWS 开发工具包对象持久化模型的批量写入操作

注意

DynamoDB 批量 API 对批中的写入数量以及批的大小有限制。有关更多信息,请参阅 BatchWriteItem。在使用 .NET 对象持久化模型 API 时,您可以指定任意数量的操作。然而,如果批中的操作数量或批的大小超出上限,.NET API 将批量写入请求拆分为更小的批,然后向 DynamoDB 发送多个批量写入请求。

批量获取:获取多个项目

要通过单个请求检索表中的多个项目,请执行以下操作:

  • 创建 CreateBatchGet 类的实例。

  • 指定要检索的一系列主键。

  • 调用 Execute 方法。响应会在 Results 属性中返回这些项目。

以下 C# 代码示例从 ProductCatalog 表中检索三个项目。结果中的项目顺序不一定和您指定的主键顺序一样。

Copy
DynamoDBContext context = new DynamoDBContext(client); var bookBatch = context.CreateBatchGet<ProductCatalog>(); bookBatch.AddKey(101); bookBatch.AddKey(102); bookBatch.AddKey(103); bookBatch.Execute(); // Process result. Console.WriteLine(devBatch.Results.Count); Book book1 = bookBatch.Results[0]; Book book2 = bookBatch.Results[1]; Book book3 = bookBatch.Results[2];

要检索多个表中的数据元,请执行以下操作:

  • 对于每个类型,创建 CreateBatchGet 类型的实例,并提供您要从每个表中检索的主键值。

  • 使用以下方法之一创建 MultiTableBatchGet 类的实例:

    • 针对您在之前步骤中创建的某个 Combine 数据元执行 BatchGet 方法。

    • 通过提供一系列 BatchGet 数据元创建 MultiBatchGet 类型的实例。

    • 执行 DynamoDBContextCreateMultiTableBatchGet 方法,并传入您的 BatchGet 数据元列表。

  • 调用 MultiTableBatchGetExecute 方法,在各个 BatchGet 数据元中返回按类型获取的结果。

以下 C# 代码段使用的是 CreateBatchGet 方法检索 Order 和 OrderDetail 表中的多个项目。

Copy
var orderBatch = context.CreateBatchGet<Order>(); orderBatch.AddKey(101); orderBatch.AddKey(102); var orderDetailBatch = context.CreateBatchGet<OrderDetail>(); orderDetailBatch.AddKey(101, "P1"); orderDetailBatch.AddKey(101, "P2"); orderDetailBatch.AddKey(102, "P3"); orderDetailBatch.AddKey(102, "P1"); var orderAndDetailSuperBatch = orderBatch.Combine(orderDetailBatch); orderAndDetailSuperBatch.Execute(); Console.WriteLine(orderBatch.Results.Count); Console.WriteLine(orderDetailBatch.Results.Count); Order order1 = orderBatch.Results[0]; Order order2 = orderDetailBatch.Results[1]; OrderDetail orderDetail1 = orderDetailBatch.Results[0];