Trabajar con índices secundarios locales: .NET
Temas
Puede utilizar la API de bajo nivel AWS SDK for .NET para crear una tabla Amazon DynamoDB con uno o varios índices secundarios locales, describir los índices de la tabla y utilizarlos para realizar consultas. Estas operaciones se mapean a las acciones correspondientes del API de bajo nivel de DynamoDB. Para obtener más información, consulte Ejemplos de código .NET.
A continuación se indican los pasos comunes para las operaciones con tablas mediante el API de bajo nivel de .NET.
-
Cree una instancia de la clase
AmazonDynamoDBClient
. -
Cree los objetos de solicitud correspondientes para proporcionar los parámetros obligatorios y opcionales de la operación.
Por ejemplo, cree un objeto
CreateTableRequest
para crear una tabla y un objetoQueryRequest
para consultar una tabla o un índice. -
Ejecute el método apropiado proporcionado por el cliente que ha creado en el paso anterior.
Creación de una tabla con un índice secundario local
Los índices secundarios locales se deben crear a la vez que se crea la tabla. Para ello, utilice CreateTable
e indique las especificaciones para uno o varios índices secundarios globales. En el ejemplo de código C# siguiente, se crea una tabla para contener información sobre las canciones de una colección de música. La clave de partición es Artist
y la de ordenación, SongTitle
. Un índice secundario, AlbumTitleIndex
, facilita las consultas por título de álbum.
A continuación se indican los pasos que hay que seguir para crear una tabla con un índice secundario local mediante la API de bajo nivel de .NET.
-
Cree una instancia de la clase
AmazonDynamoDBClient
. -
Cree una instancia de la clase
CreateTableRequest
para proporcionar la información de solicitud.Debe proporcionar el nombre de la tabla, su clave principal y los valores de rendimiento aprovisionado. Para el índice secundario local, debe proporcionar el nombre de índice, el nombre y el tipo de datos de la clave de ordenación del índice, el esquema de claves del índice y la proyección de atributos.
-
Ejecute el método
CreateTable
proporcionando el objeto de solicitud como parámetro.
En el siguiente ejemplo de código C# se ponen en práctica los pasos anteriores. En el fragmento se crea una tabla (Music
) con un índice secundario basado en el atributo AlbumTitle
. La clave de partición y la clave de ordenación de la tabla, además de la clave de ordenación del índice, son los únicos atributos proyectados en el í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);
Debe esperar hasta que DynamoDB cree la tabla y establezca el estado de esta última en ACTIVE
. A partir de ese momento, puede comenzar a incluir elementos de datos en la tabla.
Descripción de una tabla con un índice secundario local
Para obtener información acerca de los índices secundarios locales en una tabla, utilice la API DescribeTable
. Para cada índice, puede obtener acceso a su nombre, esquema de claves y atributos proyectados.
A continuación se indican los pasos que hay que seguir para acceder a la información de un índice secundario local de una tabla mediante el API de bajo nivel de .NET.
-
Cree una instancia de la clase
AmazonDynamoDBClient
. -
Cree una instancia de la clase
DescribeTableRequest
para proporcionar la información de solicitud. Debe proporcionar el nombre de la tabla. -
Ejecute el método
describeTable
proporcionando el objeto de solicitud como parámetro.
En el siguiente ejemplo de código C# se ponen en práctica los pasos anteriores.
ejemplo
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); } } }
Consulta de un índice secundario local
Puede utilizar Query
en un índice secundario local de un modo bastante parecido a como usa Query
en una tabla. Debe especificar el nombre del índice, los criterios de consulta de la clave de ordenación del índice y los atributos que desea devolver. En este ejemplo, el índice es AlbumTitleIndex
y la clave de ordenación del índice es AlbumTitle
.
Los únicos atributos devueltos son aquellos que se han proyectado en el índice. Puede modificar esta consulta de modo que también seleccione atributos sin clave, pero esto requeriría realizar actividad de recuperación en la tabla, lo que resulta relativamente costoso. Para obtener más información sobre recuperaciones de tablas, consulte Proyecciones de atributos.
A continuación se indican los pasos que hay que seguir para consultar un índice secundario local mediante la API de bajo nivel de .NET.
-
Cree una instancia de la clase
AmazonDynamoDBClient
. -
Cree una instancia de la clase
QueryRequest
para proporcionar la información de solicitud. -
Ejecute el método
query
proporcionando el objeto de solicitud como parámetro.
En el siguiente ejemplo de código C# se ponen en práctica los pasos anteriores.
ejemplo
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(); }