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

Como trabalhar com índices secundários locais: .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 locais na tabela e executar consultas usando os índices. Essas operações são mapeadas nas ações correspondentes da API de baixo nível do DynamoDB. Para ter mais informações, consulte Exemplos de código .NET.

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 crie 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 local

Os índices secundários locais devem ser criados ao mesmo tempo que uma tabela é criada. Para fazer isso, use CreateTable e forneça suas especificações para um ou mais índices secundários locais. O exemplo de código C# a seguir cria uma tabela para armazenar informações sobre músicas em uma coleção de músicas. A chave de partição é Artist e a chave de classificação é SongTitle. Um índice secundário, AlbumTitleIndex, facilita consultas por título de álbum.

Veja a seguir as etapas necessárias para criar uma tabela com um índice secundário local 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 local, você deve fornecer o nome do índice, o nome e o tipo de dados da chave de classificação do índice, o esquema de chave para o índice e a projeção de atributos.

  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 (Music) com um índice secundário no atributo AlbumTitle. A chave de partição de tabela e a chave de classificação, bem como a chave de classificação de índice, são os únicos atributos projetados para o índice.

AmazonDynamoDBClient client = new AmazonDynamoDBClient(); string tableName = "Music"; CreateTableRequest createTableRequest = new CreateTableRequest() { TableName = tableName }; //ProvisionedThroughput createTableRequest.ProvisionedThroughput = new ProvisionedThroughput() { ReadCapacityUnits = (long)5, WriteCapacityUnits = (long)5 }; //AttributeDefinitions List<AttributeDefinition> attributeDefinitions = new List<AttributeDefinition>(); attributeDefinitions.Add(new AttributeDefinition() { AttributeName = "Artist", AttributeType = "S" }); attributeDefinitions.Add(new AttributeDefinition() { AttributeName = "SongTitle", AttributeType = "S" }); attributeDefinitions.Add(new AttributeDefinition() { AttributeName = "AlbumTitle", AttributeType = "S" }); createTableRequest.AttributeDefinitions = attributeDefinitions; //KeySchema List<KeySchemaElement> tableKeySchema = new List<KeySchemaElement>(); tableKeySchema.Add(new KeySchemaElement() { AttributeName = "Artist", KeyType = "HASH" }); //Partition key tableKeySchema.Add(new KeySchemaElement() { AttributeName = "SongTitle", KeyType = "RANGE" }); //Sort key createTableRequest.KeySchema = tableKeySchema; List<KeySchemaElement> indexKeySchema = new List<KeySchemaElement>(); indexKeySchema.Add(new KeySchemaElement() { AttributeName = "Artist", KeyType = "HASH" }); //Partition key indexKeySchema.Add(new KeySchemaElement() { AttributeName = "AlbumTitle", KeyType = "RANGE" }); //Sort key Projection projection = new Projection() { ProjectionType = "INCLUDE" }; List<string> nonKeyAttributes = new List<string>(); nonKeyAttributes.Add("Genre"); nonKeyAttributes.Add("Year"); projection.NonKeyAttributes = nonKeyAttributes; LocalSecondaryIndex localSecondaryIndex = new LocalSecondaryIndex() { IndexName = "AlbumTitleIndex", KeySchema = indexKeySchema, Projection = projection }; List<LocalSecondaryIndex> localSecondaryIndexes = new List<LocalSecondaryIndex>(); localSecondaryIndexes.Add(localSecondaryIndex); createTableRequest.LocalSecondaryIndexes = localSecondaryIndexes; CreateTableResponse result = client.CreateTable(createTableRequest); Console.WriteLine(result.CreateTableResult.TableDescription.TableName); Console.WriteLine(result.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 local

Para obter mais informações sobre índices secundários locais em uma tabela, use a API 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 local para uma tabela usando a API de baixo nível do .NET.

  1. Crie uma instância da classe AmazonDynamoDBClient.

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

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

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

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

Consultar um índice secundário local

Você pode usar Query em um índice secundário local de forma semelhante ao uso de Query em uma tabela. Você deve especificar o nome do índice, os critérios de consulta da chave de classificação do índice e os atributos que deseja retornar. Neste exemplo, o índice é AlbumTitleIndex e a chave de classificação do índice é AlbumTitle.

Os únicos atributos retornados são aqueles que foram projetados no índice. É possível modificar essa consulta para selecionar atributos não chave também, mas isso exigiria atividades de busca de tabela que são relativamente caras. Para obter mais informações sobre buscas de tabela, consulte Projeções de atributo

Veja a seguir as etapas para consultar um índice secundário local 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 exemplo de código C# a seguir demonstra as etapas anteriores.

exemplo
QueryRequest queryRequest = new QueryRequest { TableName = "Music", IndexName = "AlbumTitleIndex", Select = "ALL_ATTRIBUTES", ScanIndexForward = true, KeyConditionExpression = "Artist = :v_artist and AlbumTitle = :v_title", ExpressionAttributeValues = new Dictionary<string, AttributeValue>() { {":v_artist",new AttributeValue {S = "Acme Band"}}, {":v_title",new AttributeValue {S = "Songs About Life"}} }, }; QueryResponse response = client.Query(queryRequest); foreach (var attribs in response.Items) { foreach (var attrib in attribs) { Console.WriteLine(attrib.Key + " ---> " + attrib.Value.S); } Console.WriteLine(); }