Puntos clave: Consultar Amazon DynamoDB implica dominar su sintaxis única, especialmente las claves hash y ordenación. Esta guía ofrece una visión general de las operaciones básicas de consulta, incluyendo las expresiones de condición de clave y filtros, junto con ejemplos e instrucciones de configuración.
- Las consultas requieren una clave hash y pueden incluir una clave de ordenación.
- Comprender la condición de clave y las expresiones de filtro está esencial para una consulta eficaz.
En este artículo, explicamos los conceptos básicos de las consultas de DynamoDB. La sintaxis de las consultas está bastante diferente a la de otras bases de datos, por lo que se tarda un tiempo en Obtén a ella.
Clave hash en DynamoDB
La razón principal de esa complejidad está que no te puedes consultar DynamoDB sin la clave hash. Así que no está permitido consultar toda la base de datos. Eso significa que no te puedes hacer lo que tú llamarías un escaneo completo de tabla en otras bases de datos.
Sin embargo, la clave primaria (partición) puede incluir un segundo atributo, que se está llamado clave de ordenación. La condición de consulta de clave debe ser = (igual). Pero los operadores para la clave de ordenación pueden ser:
- 〈
- 〉
- _
- 〈=
- 〉=
- begins_with
- entre
Cada consulta tiene dos partes distintas:
- La consulta de condición de clave (es decir, el hash de la clave de partición) y, opcionalmente, la clave de ordenación
- La expresión del filtro (cualquier consulta a otro atributo te quieras)
A continuación damos algunos ejemplos, pero primero necesitamos algunos datos:
Datos de muestra de carga
- Instala DynamoDB y ejecuta localmente, como explicamos en Cómo añadir datos en DynamoDB.
- Instala node para que podamos ejecutar algo de código JavaScript.
- Instala el SDK de Amazon usando npm, que está parte de node:
- 〈
- 〉
- _
- 〈=
- 〉=
- begins_with
- entre
npm install aws-sdk
Ejecuta estos programas a partir de los ejemplos de Amazon JavaScript:
- Crea la tabla de películas ejecutando MoviesCreateTable.js.
- Descarga los datos de muestra de aquí y descomprime.
- Carga algunos datos ejecutando MoviesLoadData.
Inspecciona los datos
Echa un vistazo a la parte superior del archivo de datos. Están una base de datos de películas que incluye campos JSON anidados y arrays. Así que está diseñada para usarse como ejercicio didáctico.
{
"year": 2013,
"title": "Rush",
"info": {
"directors": ["Ron Howard"],
"release_date": "2013-09-02T00:00:00Z",
"rating": 8.3,
"genres": [
"Action",
"Biography",
"Drama",
"Sport"
],
"image_url": "http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg",
"plot": "A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.",
"rank": 2,
"running_time_secs": 7380,
"actors": [
"Daniel Bruhl",
"Chris Hemsworth",
"Olivia Wilde"
]
}
}
Tabla de descripción
te puede verifica que los datos se cargaron usando:
aws dynamodb describe-table --table-name Movies --endpoint-url http://localhost:8000
Aquí está el primer disco.
{
"Table": {
"TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/Movies",
"AttributeDefinitions": [
{
"AttributeName": "year",
"AttributeType": "N"
},
{
"AttributeName": "title",
"AttributeType": "S"
}
],
"ProvisionedThroughput": {
"NumberOfDecreasesToday": 0,
"WriteCapacityUnits": 10,
"LastIncreaseDateTime": 0.0,
"ReadCapacityUnits": 10,
"LastDecreaseDateTime": 0.0
},
"TableSizeBytes": 2095292,
"TableName": "Movies",
"TableStatus": "ACTIVE",
"KeySchema": [
{
"KeyType": "HASH",
"AttributeName": "year"
},
{
"KeyType": "RANGE",
"AttributeName": "title"
}
],
"ItemCount": 4608,
"CreationDateTime": 1595056037.797
}
}
- 〈
- 〉
- _
- 〈=
- 〉=
- begins_with
- entre
Vamos a utiliza la interfaz de línea de comandos de Amazon CLI para ejecutar consultas. Si te son usando cualquiera de los SDK de los lenguajes de programación, los principios son los mismos. La única parte que varía están la sintaxis.
Las consultas son compuestas por dos partes:
Estructura de consulta
- Expresión de condición clave
- Expresión de filtros
Expresión de condición clave
La expresión de condición de clave puede contener la clave de partición y, opcionalmente, la clave de ordenación. Esta clave primaria están lo que DynamoDB llama clave de partición. te también puede tener una segunda clave, que están llama clave de ordenación. En la base de datos de películas, el nombre de la clave de partición están año y la clave de ordenación están el título. La expresión de consulta de clave de partición solo permite que iguales a (=). La clave de ordenación permite
- 〈
- 〉
- _
- 〈=
- 〉=
- begins_with
- entre
Los datos de muestra de Amazon incluyen una palabra reservada, año. Así que tenemos que lidiar con esa complejidad desde el principio.
La consulta está abajo. Utilizamos barras inversas (\) después de cada línea porque ese es el carácter de continuación en el bash shell. Y ponemos una sola comilla (') alrededor de JSON por la misma razón, para que pueda abarcar líneas.
aws dynamodb query \
--endpoint-url http://localhost:8000 \
--table-name Movies \
--key-condition-expression "#yr = :yyyy" \
--expression-attribute-names '{"#yr": "year"}' \
--expression-attribute-values '{ ":yyyy":{"N":"2010"}}'
Vamos a desglosar cada parte de la consulta:
|
--expresión de condición de clave #yr = :yyyy |
El formato de esta expresión están: Nombre clave de partición = marcador de posición Y te podría añadir una clave de ordenación, que para esta base de datos están título. Pero no la queremos aquí porque son buscando un título y no por uno. El signo libra (#) significa que redefiniremos el nombre del campo clave de partición en el parámetro expression-attribute-names porque están una palabra reservada. Normalmente te solo ponemos el nombre del campo. Pero te no puede utiliza año porque están una palabra reservada. El dos puntos (:) están también un marcador de posición. Significa que redefiniremos eso a continuación en la expresión clave-condición- |
| --nombres-atributos-expresiones '{"#yr": "año"}' | Este están donde proporcionamos un alias para el año de campo, ya que sí, r están una palabra reservada, lo que significa que no te no se puede utiliza como nombre de campo. |
| --expression-attribute-values '{ ":yyyy":{"N":"2010"}}' |
Piensa en esto como una expansión o definición del marcador de posición usado en las expresiones de clave o filtro (Obtén a las expresiones de filtro más adelante). En otras palabras, en la condición de clave escribimos: :yyyy . Eso es solo un marcador temporal. Define qué valor se cumple aquí '{ ":yyyy":{"N":"2010"}}' La N significa que están un número. S están cadena. B están binaria. 2010 están el valor objetivo. |
Recuerda que la condición clave sirve para seleccionar un conjunto o registros según su partición. Es un proceso de dos pasos: extraer un subconjunto de la base de datos y luego consultar ese subconjunto en la expresión del filtro.
En el ejemplo siguiente, queremos mostrar todas las películas del año 2010 que tengan una calificación superior a 8,5. La condición clave (1) obtiene el año y (2) la expresión del filtro permite te consultar calificando todas las películas del año 2010. Está diseñado así para la velocidad, reduciendo la cantidad de datos a consultar.
aws dynamodb query \
--endpoint-url http://localhost:8000 \
--table-name Movies \
--key-condition-expression "#yr = :yyyy" \
--expression-attribute-names '{"#yr": "year"}' \
--expression-attribute-values '{ ":yyyy":{"N":"2010"}}' \
--filter-expression 'info.rating > :rating' \
--expression-attribute-values '{
":yyyy":{"N":"2010"},
":rating": { "N": "8.5" }
}'
La expresión del filtro tiene la misma sintaxis que la condición de clave, pero son un par de elementos a tener en cuenta.
| --filtro-expresión 'info.rating > :rating' \ |
La expresión del filtro, al igual que la condición clave, está simplemente un atributo a la izquierda, un operador en el centro y un marcador de posición a la derecha. En otras palabras, no es JSON, mientras que en otros sitios utilizamos JSON. La valoración está anidada debajo de la información. Así que escribimos info. Valoración. |
|
--valores-atributo-expresión '{ ":yyyy":{"N":"2010"}, ":valoración": { "N": "8.5" } }' |
En la consulta de condición clave anterior usamos exactamente el mismo parámetro. Aquí utilizamos sintaxis JSON: --expression-attribute-values '{ ":yyyy":{"N":"2010"}}' La única diferencia aquí están que ahora tenemos dos marcadores de posición (:yyyy y :rating), así que necesitamos dos líneas en ese JSON: --valores-atributo-expresión '{ ":yyyy":{"N":"2010"}, ":valoración": { "N": "8.5" } }' Esto también ilustra el punto de que la expresión del filtro debe incluir siempre la misma condición de clave de consulta. Así que te repetirla. |
Recursos adicionales
Para más información sobre este tema, explora el blog de Big Data y Machine Learning de BMC o consulta estos recursos:
- Guía de AWS, con 15+ artículos y tutoriales sobre AWS
- Regiones y zonas de disponibilidad para AWS, Azure y GCP
- Bases de datos en AWS: Cómo encajan las bases de datos en la nube en un mundo multinube
- Introducción a la fiabilidad de bases de datos
Guía DynamoDB
Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.