Como trabalhar com índices secundários globais: .NET - Amazon DynamoDB

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Como trabalhar com índices secundários globais: .NET

Você pode usar a API de baixo nível do AWS SDK for .NET para criar uma tabela do Amazon DynamoDB com um ou mais índices secundários globais na tabela e executar consultas usando os índices. Essas operações são mapeadas nas operações do DynamoDB correspondentes. Para obter mais informações, consulte a Referência de API do Amazon DynamoDB.

Veja a seguir as etapas comuns para operações de tabela usando a API de baixo nível do .NET.

  1. Crie uma instância da classe AmazonDynamoDBClient.

  2. Forneça os parâmetros obrigatórios e opcionais para a operação, criando os objetos de solicitação correspondentes.

    Por exemplo, crie um objeto CreateTableRequest para criar uma tabela e um objeto QueryRequest para consultar uma tabela ou um índice.

  3. Execute o método apropriado fornecido pelo cliente que você criou na etapa anterior.

Criar uma tabela com um índice secundário global

Você pode criar índices secundários globais ao mesmo tempo em que cria uma tabela. Para fazer isso, use CreateTable e forneça suas especificações para um ou mais índices secundários globais. O exemplo de código C#a seguir cria uma tabela para armazenar informações sobre dados climáticos. A chave de partição é Location e a chave de classificação é Date. Um índice secundário global chamado PrecipIndex permite acesso rápido aos dados de precipitação de vários locais.

Veja a seguir as etapas necessárias para criar uma tabela com um índice secundário global usando a API de baixo nível do .NET.

  1. Crie uma instância da classe AmazonDynamoDBClient.

  2. Crie uma instância da classe CreateTableRequest para fornecer as informações solicitadas.

    Você deve fornecer o nome da tabela, sua chave primária e os valores de throughput provisionado. Para o índice secundário global, você deve fornecer o nome do índice, suas configurações de throughput provisionado, as definições de atributo da chave de classificação do índice, o esquema de chaves do índice e a projeção do atributo.

  3. Execute o método CreateTable fornecendo o objeto de solicitação como um parâmetro.

O exemplo de código C# a seguir demonstra as etapas anteriores. O código cria uma tabela (WeatherData) com um índice secundário global (PrecipIndex). A chave de partição do índice é Date e a chave de classificação é Precipitation. Todos os atributos da tabela estão projetados no índice. Os usuários podem consultar esse índice para obter dados climáticos de uma data específica, opcionalmente, classificar os dados por quantidade de precipitação.

Como Precipitation não é um atributo de chave para a tabela, ele não é necessário. No entanto, os itens de WeatherData sem Precipitation não aparecem no PrecipIndex.

client = new AmazonDynamoDBClient(); string tableName = "WeatherData"; // Attribute definitions var attributeDefinitions = new List<AttributeDefinition>() { {new AttributeDefinition{ AttributeName = "Location", AttributeType = "S"}}, {new AttributeDefinition{ AttributeName = "Date", AttributeType = "S"}}, {new AttributeDefinition(){ AttributeName = "Precipitation", AttributeType = "N"} } }; // Table key schema var tableKeySchema = new List<KeySchemaElement>() { {new KeySchemaElement { AttributeName = "Location", KeyType = "HASH"}}, //Partition key {new KeySchemaElement { AttributeName = "Date", KeyType = "RANGE"} //Sort key } }; // PrecipIndex var precipIndex = new GlobalSecondaryIndex { IndexName = "PrecipIndex", ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = (long)10, WriteCapacityUnits = (long)1 }, Projection = new Projection { ProjectionType = "ALL" } }; var indexKeySchema = new List<KeySchemaElement> { {new KeySchemaElement { AttributeName = "Date", KeyType = "HASH"}}, //Partition key {new KeySchemaElement{AttributeName = "Precipitation",KeyType = "RANGE"}} //Sort key }; precipIndex.KeySchema = indexKeySchema; CreateTableRequest createTableRequest = new CreateTableRequest { TableName = tableName, ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = (long)5, WriteCapacityUnits = (long)1 }, AttributeDefinitions = attributeDefinitions, KeySchema = tableKeySchema, GlobalSecondaryIndexes = { precipIndex } }; CreateTableResponse response = client.CreateTable(createTableRequest); Console.WriteLine(response.CreateTableResult.TableDescription.TableName); Console.WriteLine(response.CreateTableResult.TableDescription.TableStatus);

Você deve aguardar até que o DynamoDB crie a tabela e defina o status dessa tabela como ACTIVE. Depois disso, você poderá começar a inserir itens de dados na tabela.

Descrever uma tabela com um índice secundário global

Para obter mais informações sobre índices secundários globais em uma tabela, use DescribeTable. Para cada índice, você pode acessar seu nome, esquema de chaves e atributos projetados.

Veja a seguir as etapas para acessar informações do índice secundário global para uma tabela usando a API de baixo nível do .NET.

  1. Crie uma instância da classe AmazonDynamoDBClient.

  2. Execute o método describeTable fornecendo o objeto de solicitação como um parâmetro.

    Crie uma instância da classe DescribeTableRequest para fornecer as informações solicitadas. Você deve fornecer o nome da tabela.

O exemplo de código C# a seguir demonstra as etapas anteriores.

exemplo
client = new AmazonDynamoDBClient(); string tableName = "WeatherData"; DescribeTableResponse response = client.DescribeTable(new DescribeTableRequest { TableName = tableName}); List<GlobalSecondaryIndexDescription> globalSecondaryIndexes = response.DescribeTableResult.Table.GlobalSecondaryIndexes; // This code snippet will work for multiple indexes, even though // there is only one index in this example. foreach (GlobalSecondaryIndexDescription gsiDescription in globalSecondaryIndexes) { Console.WriteLine("Info for index " + gsiDescription.IndexName + ":"); foreach (KeySchemaElement kse in gsiDescription.KeySchema) { Console.WriteLine("\t" + kse.AttributeName + ": key type is " + kse.KeyType); } Projection projection = gsiDescription.Projection; Console.WriteLine("\tThe projection type is: " + projection.ProjectionType); if (projection.ProjectionType.ToString().Equals("INCLUDE")) { Console.WriteLine("\t\tThe non-key projected attributes are: " + projection.NonKeyAttributes); } }

Consultar um índice secundário global

Você pode usar Query em um índice secundário global de forma semelhante ao uso de Query em uma tabela. Você precisa especificar o nome do índice, os critérios de consulta da chave de partição e da chave de classificação (se houver) do índice, e os atributos que você deseja retornar. Neste exemplo, o índice é PrecipIndex, que tem uma chave de partição Date e uma chave de classificação Precipitation. A consulta de índice retorna todos os dados climáticos de uma data específica, na qual a precipitação é maior que zero.

Veja a seguir as etapas para consultar um índice secundário global usando a API de baixo nível do .NET.

  1. Crie uma instância da classe AmazonDynamoDBClient.

  2. Crie uma instância da classe QueryRequest para fornecer as informações solicitadas.

  3. Execute o método query fornecendo o objeto de solicitação como um parâmetro.

O nome do atributo Date é uma palavra reservada do DynamoDB. Portanto, use um nome de atributo de expressão como um espaço reservado na KeyConditionExpression.

O exemplo de código C# a seguir demonstra as etapas anteriores.

exemplo
client = new AmazonDynamoDBClient(); QueryRequest queryRequest = new QueryRequest { TableName = "WeatherData", IndexName = "PrecipIndex", KeyConditionExpression = "#dt = :v_date and Precipitation > :v_precip", ExpressionAttributeNames = new Dictionary<String, String> { {"#dt", "Date"} }, ExpressionAttributeValues = new Dictionary<string, AttributeValue> { {":v_date", new AttributeValue { S = "2013-08-01" }}, {":v_precip", new AttributeValue { N = "0" }} }, ScanIndexForward = true }; var result = client.Query(queryRequest); var items = result.Items; foreach (var currentItem in items) { foreach (string attr in currentItem.Keys) { Console.Write(attr + "---> "); if (attr == "Precipitation") { Console.WriteLine(currentItem[attr].N); } else { Console.WriteLine(currentItem[attr].S); } } Console.WriteLine(); }