Batch write to proces pozwalający na dodawanie i usuwanie wielu elementów jednocześnie. Metoda BatchWriteItem pozwala na dodawanie i usuwanie wielu elementów z jednej lub wielu tabel w jednym wywołaniu. Kroki, które są wymagane do wykonania te operacji (poza standardowymi) to utworzenie instancji klasy BatchWriteItemRequest wraz z opisem operacji (PUT lub DELETEBatchWriteItem z wykorzystaniem powyższego żądania jako parametru tej metody. Ostatni krok to sprawdzenie odpowiedzi – co mam na myśli? Powinniśmy sprawdzić czy w odpowiedzi są jakieś nieprzetworzone elementy żądania. Dodatkowo (o czym pisałem już wcześniej), DynamoDB ogranicza rozmiar żądania i liczbę operacji, które można określić w żądaniu. Jeżeli przekroczymy te limity dojdzie do odrzucenia żądania przez DynamoDB.
Mając w głowie poprzednie wpisy stwórzcie proszę dodatkową tabelę, niech to będzie np. Orders. W ramach naszego przykładu dodamy kolejny element do tabeli CarCatalog a w tym samym żądaniu do drugiej tabeli dodamy informacje o zamówieniach przy czym jedno z nich usuniemy, żeby sprawdzić możliwości metody BatchWriteItem. W kodzie możecie utworzyć sobie pomocniczą metodę do tworzenia nowych tabel gdzie podmienimy tylko nazwę tabeli i zdefiniujemy atybuty (spójrzcie poniżej):
private async Task<ActionResult<string>> CreateSampleTable() { var request = new CreateTableRequest { TableName = TableName3, // Podmieniamy nazwę parametru na 'kolejną tabelę' AttributeDefinitions = new List<AttributeDefinition>() // określamy atrybuty { new AttributeDefinition { AttributeName = "Id", AttributeType = "N" }, new AttributeDefinition { AttributeName = "CarOrder", AttributeType = "N" }, new AttributeDefinition { AttributeName = "Message", AttributeType = "S" }, new AttributeDefinition { AttributeName = "KeywordTags", AttributeType = "S" } }, KeySchema = new List<KeySchemaElement> { new KeySchemaElement { AttributeName = "Id", KeyType = "HASH" // partition key }, new KeySchemaElement { AttributeName = "ReplyDateTime", KeyType = "RANGE" //sort key } }, ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 5, WriteCapacityUnits = 10 } }; var response = await _amazonDynamoDB.CreateTableAsync(request); var tableDescription = response.TableDescription; StringBuilder sb = new StringBuilder(); sb.AppendLine($"Tabela: {tableDescription.TableName} | Status: {tableDescription.TableStatus}"); sb.AppendLine($"ReadCapacityUnit: {tableDescription.ProvisionedThroughput.ReadCapacityUnits}"); sb.AppendLine($"WriteCapacityUnit: {tableDescription.ProvisionedThroughput.WriteCapacityUnits}"); WaitUntilTableReady(TableName3); return sb.ToString(); }Po wykonaniu powyższego kodu możemy sprawdzić czy rzeczywiście tabela została utworzona a my mamy do dyspozycji dwie tabele: Drugi krok to przygotowanie kodu:
public async Task<ActionResult<string>> WriteItemBatch() { var request = new BatchWriteItemRequest() { RequestItems = new Dictionary<string, List<WriteRequest>> { { TableName1, new List<WriteRequest> { new WriteRequest { PutRequest = new PutRequest { Item = new Dictionary<string, AttributeValue> { { "Id", new AttributeValue {N = "2"} }, { "Brand", new AttributeValue {S = "Audi"} }, { "Model", new AttributeValue{S = "R8"} }, { "Color", new AttributeValue {S = "Progressive Red"} }, { "Price", new AttributeValue { S = "1 064 000"} }, } } } } }, { TableName2, new List<WriteRequest> { new WriteRequest { PutRequest = new PutRequest { Item = new Dictionary<string, AttributeValue> { { "Id", new AttributeValue {N = "1"} }, { "CarOrder", new AttributeValue {N = "2"} }, { "Message", new AttributeValue{S = "You order has beed completed!"} }, { "KeywordTags", new AttributeValue {S = "Audi R8, Progressive Red, 1 064 000"} }, } } }, new WriteRequest { DeleteRequest = new DeleteRequest { Key = new Dictionary<string, AttributeValue> { { "Id", new AttributeValue {N = "2"} }, } } } } } } }; var response = await _amazonDynamoDB.BatchWriteItemAsync(request); return Json(response); }Po wykonaniu powyższego kodu możemy zobaczyć, że wszystkie elementy zostały poprawnie przeprocesowane:
W kolejnym wpisie pobierzemy wiele elementów z jednej lub wielu tabel.