Trabajar con índices secundarios globales: AWS CLI
Puede utilizar la AWS CLI para crear una tabla de Amazon DynamoDB con uno o varios índices secundarios globales, describir los índices de la tabla y utilizarlos para realizar consultas.
Temas
Creación de una tabla con un índice secundario global
Se pueden crear índices secundarios globales al mismo tiempo que se crea una tabla. Para ello, utilice el parámetro create-table
y proporcione sus especificaciones para uno o más índices secundarios globales. En el siguiente ejemplo, se crea una tabla llamada GameScores
con un índice secundario global GameTitleIndex
. La tabla base tiene una clave de partición de UserId
y una clave de ordenación de GameTitle
, lo que le permite encontrar eficientemente la mejor puntuación de un usuario individual para un juego específico, mientras que el GSI tiene una clave de partición de GameTitle
y una clave de ordenación de TopScore
, lo que te permite encontrar rápidamente la puntuación más alta en general para un juego en particular.
aws dynamodb create-table \ --table-name GameScores \ --attribute-definitions AttributeName=UserId,AttributeType=S \ AttributeName=GameTitle,AttributeType=S \ AttributeName=TopScore,AttributeType=N \ --key-schema AttributeName=UserId,KeyType=HASH \ AttributeName=GameTitle,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5 \ --global-secondary-indexes \ "[ { \"IndexName\": \"GameTitleIndex\", \"KeySchema\": [{\"AttributeName\":\"GameTitle\",\"KeyType\":\"HASH\"}, {\"AttributeName\":\"TopScore\",\"KeyType\":\"RANGE\"}], \"Projection\":{ \"ProjectionType\":\"INCLUDE\", \"NonKeyAttributes\":[\"UserId\"] }, \"ProvisionedThroughput\": { \"ReadCapacityUnits\": 10, \"WriteCapacityUnits\": 5 } } ]"
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. Puede utilizar describe-table Para determinar el estado de la creación de tablas.
Adición de un índice secundario global a una tabla existente
Los índices secundarios globales también se pueden agregar o modificar después de la creación de la tabla. Para ello, utilice el parámetro update-table
y proporcione sus especificaciones para uno o más índices secundarios globales. En el siguiente ejemplo se utiliza el mismo esquema que el ejemplo anterior, pero se supone que la tabla ya se ha creado y que vamos a agregar el GSI más adelante.
aws dynamodb update-table \ --table-name GameScores \ --attribute-definitions AttributeName=TopScore,AttributeType=N \ --global-secondary-index-updates \ "[ { \"Create\": { \"IndexName\": \"GameTitleIndex\", \"KeySchema\": [{\"AttributeName\":\"GameTitle\",\"KeyType\":\"HASH\"}, {\"AttributeName\":\"TopScore\",\"KeyType\":\"RANGE\"}], \"Projection\":{ \"ProjectionType\":\"INCLUDE\", \"NonKeyAttributes\":[\"UserId\"] } } } ]"
Descripción de una tabla con un índice secundario global
Para obtener información acerca de los índices secundarios globales en una tabla, utilice el parámetro describe-table
. Para cada índice, puede obtener acceso a su nombre, esquema de claves y atributos proyectados.
aws dynamodb describe-table --table-name GameScores
Consulta de un índice secundario local
Puede utilizar la operación query
en un índice secundario global de un modo bastante similar a como se 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 GameTitleIndex
y la clave de ordenación del índice es GameTitle
.
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.
aws dynamodb query --table-name GameScores\ --index-name GameTitleIndex \ --key-condition-expression "GameTitle = :v_game" \ --expression-attribute-values '{":v_game":{"S":"Alien Adventure"} }'