Metoda BatchGetItem pozwala na pobranie wielu elementów z jednej lub wielu tabel. Jak doskonale pamiętacie, pobranie pojedynczego elementu jest możliwe dzięki metodzie GetItem.
W celu wykorzystania metody BatchGetItem musimy przygotować żądanie wykorzystując instancję klasy BatchGetItemRequest podając nazwę tabeli i listę wartości klucza głównego. Kolejny krok to wywołanie metody BatchGetItem wykorzystując powyższy obiekt żądania jako parametr. Podobnie, jak w przypadku poprzedniego wpisu, powinniśmy sprawdzić czy w odpowiedzi nie było żadnych nieprzetworzonych kluczy do czego mogło dojść w przypadku osiągnięcia przewidzianego limitu przepustowości lub innego przejściowego błędu związanego z dostępem do danych.
W poniższym przykładzie pobierzemy elementy z dwóch tabel, tj. CarCatalog oraz Orders. Pobierzemy oba elementy z pierwszej tabeli oraz jeden z drugiej:
public async Task<ActionResult<string>> GetItemBatch()
{
var request = new BatchGetItemRequest
{
RequestItems = new Dictionary<string, KeysAndAttributes>
{
{ TableName1, new KeysAndAttributes
{
Keys = new List<Dictionary<string, AttributeValue>>()
{
new Dictionary<string, AttributeValue>
{
{ "Id", new AttributeValue { N = "1" } }
},
new Dictionary<string, AttributeValue>
{
{ "Id", new AttributeValue { N = "2" } }
}
}
} },
{
TableName2, new KeysAndAttributes
{
Keys = new List<Dictionary<string, AttributeValue>>()
{
new Dictionary<string, AttributeValue>
{
{ "Id", new AttributeValue {N = "1"} },
}
}
}
}
}
};
var response = await _amazonDynamoDB.BatchGetItemAsync(request);
// Sprawdzenie odpowiedzi
// Lista atrybytów
var result = response.Responses;
StringBuilder sb = new StringBuilder();
// Poniższy kod moglibyśmy napisać w bardziej przejrzysty sposób
// to jednak nie temat tego wpisu
var table1Results = result[TableName1];
sb.AppendLine($"Items in table {TableName1}");
foreach (var carDictionary in table1Results)
{
// Zerknicie tutaj: https://www.plukasiewicz.net/AwsLambda/DynamoDbLambda
// jeżeli checie pobrać wartości danych atrybutów w dokładniejszy sposób
string json = JsonConvert.SerializeObject(carDictionary, Formatting.Indented);
sb.AppendLine(json);
}
var table2Results = result[TableName2];
sb.AppendLine($"Items in table {TableName2}");
foreach (var orderDictionary in table2Results)
{
string json = JsonConvert.SerializeObject(orderDictionary, Formatting.Indented);
sb.AppendLine(json);
}
// Sprawdzmy czy mamy jakies nieprzetworzone klucze
// Powód: przekroczenie ProvisionedThroughput lub inny problem
Dictionary<string, KeysAndAttributes> unprocessedKeys = response.UnprocessedKeys;
foreach (KeyValuePair<string, KeysAndAttributes> pair in unprocessedKeys)
{
sb.AppendLine("Nieprzetworzone klucze: ");
sb.AppendLine($"{pair.Key}, {pair.Value}");
}
return sb.ToString();
}
Jeżeli zależy Wam na dokładniejszym sprawdzeniu/wyciągnięciu odpowiedzi zachęcam do zerknięcia do tego wpisu: AWS Lambda - Lambda z DynamoDB w którym pokazałem dynamiczne mapowanie używane w DynamoDB.