Consulta de datos con AQL

En este capítulo, discutiremos cómo consultar datos usando AQL. Ya hemos comentado en capítulos anteriores que ArangoDB ha desarrollado su propio lenguaje de consulta y que se llama AQL.

Empecemos ahora a interactuar con AQL. Como se muestra en la imagen a continuación, en la interfaz web, haga clic en el botón Editor de AQL la pestaña está en la parte superior de la barra de navegación. Aparece un editor de consultas vacío.

Si es necesario, puede cambiar al editor desde la visualización de resultados y viceversa haciendo clic en la pestaña Consulta o Resultado en la esquina superior derecha como se muestra en la imagen a continuación:

Ir al editor desde la vista de resultados

Entre otras cosas, el editor tiene resaltado de sintaxis, deshacer / rehacer y guardar solicitudes. Se pueden encontrar más detalles en la documentación oficial. Destacaremos algunas funciones básicas y de uso común del editor de consultas AQL.

Conceptos básicos de AQL

En AQL, una consulta representa el resultado final que se debe lograr, pero no el proceso mediante el cual se logra el resultado final. Esta característica se conoce comúnmente como propiedad de lenguaje declarativo. Además, AQL puede consultar y modificar datos, por lo que se pueden crear consultas complejas combinando ambos procesos.

Tenga en cuenta que AQL es totalmente compatible con ACID. Leer o modificar solicitudes se completará o no se completará en absoluto. Incluso la lectura de los datos del documento terminará con una unidad de datos coherente.

Agregar dos nuevos canciones en una colección de canciones ya creada. En lugar de escribir, puede copiar la siguiente consulta y pegarla en el editor AQL:

FOR song IN [
   {
      title: "Air-Minded Executive", lyricist: "Johnny Mercer",
      composer: "Bernie Hanighen", Year: 1940, _key: "Air-Minded"
   },
   
   {
      title: "All Mucked Up", lyricist: "Johnny Mercer", composer:
      "Andre Previn", Year: 1974, _key: "All_Mucked"
   }
]
INSERT song IN songs

Haga clic en el botón Ejecutar en la esquina inferior izquierda.

Escribirá dos nuevos documentos en canciones colección.

Esta consulta describe cómo funciona el bucle FOR en AQL; itera sobre la lista de documentos JSON codificados y realiza operaciones codificadas en cada uno de los documentos de la colección. Varias operaciones pueden incluir crear nuevas estructuras, filtrar, seleccionar documentos, modificar o insertar documentos en la base de datos (ver ejemplo instantáneo). Esencialmente, AQL puede realizar operaciones CRUD de manera eficiente.

Para encontrar todas las canciones en nuestra base de datos, ejecutemos nuevamente la siguiente consulta, equivalente a SELECCIONAR * DE canciones bases de datos como SQL (dado que el editor recuerda la última consulta, presione *Nuevo* botón borrar editor) –

FOR song IN songs
RETURN song

El conjunto de resultados muestra una lista de canciones guardadas en canciones colección como se muestra en la captura de pantalla a continuación.

Lista de canciones

Operaciones como FILTRO, CLASIFICACIÓN y LÍMITE se puede agregar a Por ciclo cuerpo para estrechar y ordenar el resultado.

FOR song IN songs
FILTER song.Year > 1940
RETURN song

La consulta anterior dará las canciones creadas después de 1940 en la pestaña Resultado (ver imagen a continuación).

Solicitar canciones creadas después de year_1940

Este ejemplo usa la clave del documento, pero cualquier otro atributo también se puede usar como equivalente para el filtrado. Dado que se garantiza que la clave del documento es única, no más de un documento coincidirá con este filtro. Este puede no ser el caso de otros atributos. Para devolver un subconjunto de usuarios activos (identificados por un atributo llamado estado) ordenados por nombre en orden ascendente, usamos la siguiente sintaxis:

FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
RETURN song
LIMIT 2

Hemos incluido deliberadamente este ejemplo. Aquí vemos el mensaje de error de sintaxis de consulta resaltado en rojo usando AQL. Esta sintaxis resalta los errores y ayuda a depurar consultas como se muestra en la captura de pantalla a continuación.

La sintaxis destaca errores

Ejecutemos la consulta correcta ahora (tenga en cuenta la solución):

FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
LIMIT 2
RETURN song

Ejecuta la consulta correcta

Consulta compleja en AQL

AQL tiene muchas funciones para todos los tipos de datos admitidos. La asignación de una variable en una consulta le permite crear construcciones anidadas muy complejas. De esta manera, las operaciones con uso intensivo de datos se acercan más a los datos en el back-end que al cliente (como el navegador). Para entender esto, primero agreguemos una duración arbitraria (longitud) a las canciones.

Comencemos con la primera función, es decir, la función de actualización –

UPDATE { _key: "All_Mucked" }
WITH { length: 180 }
IN songs

Consulta compleja en AQL

Podemos ver que se escribió un documento como se muestra en la captura de pantalla anterior.

Actualicemos otros documentos (canciones) ahora.

UPDATE { _key: "Affable_Balding" }
WITH { length: 200 }
IN songs

Ahora podemos comprobar que todas nuestras canciones tienen un nuevo atributo largo

FOR song IN songs
RETURN song

Salida

[
   {
      "_key": "Air-Minded",
      "_id": "songs/Air-Minded",
      "_rev": "_VkC5lbS---",
      "title": "Air-Minded Executive",
      "lyricist": "Johnny Mercer",
      "composer": "Bernie Hanighen",
      "Year": 1940,
      "length": 210
   },
   
   {
      "_key": "Affable_Balding",
      "_id": "songs/Affable_Balding",
      "_rev": "_VkC4eM2---",
      "title": "Affable Balding Me",
      "lyricist": "Johnny Mercer",
      "composer": "Robert Emmett Dolan",
      "Year": 1950,
      "length": 200
   },
   
   {
      "_key": "All_Mucked",
      "_id": "songs/All_Mucked",
      "_rev": "_Vjah9Pu---",
      "title": "All Mucked Up",
      "lyricist": "Johnny Mercer",
      "composer": "Andre Previn",
      "Year": 1974,
      "length": 180
   },
   
   {
      "_key": "Accentchuate_The",
      "_id": "songs/Accentchuate_The",
      "_rev": "_VkC3WzW---",
      "title": "Accentchuate The Politics",
      "lyricist": "Johnny Mercer",
      "composer": "Harold Arlen",
      "Year": 1944,
      "length": 190
   }
]

Para ilustrar el uso de otras palabras clave AQL como LET, FILTER, SORT, etc., ahora formateamos la duración de la canción en el formato mm: ss formato.

Consulta

FOR song IN songs
FILTER song.length > 150
LET seconds = song.length % 60
LET minutes = FLOOR(song.length / 60)
SORT song.composer
RETURN
{
   Title: song.title, 
   Composer: song.composer, 
   Duration: CONCAT_SEPARATOR(':',minutes, seconds) 
}

Consulta compleja en AQL 2

Esta vez, devolveremos el título de la canción junto con la duración. EN Regreso La función le permite crear un nuevo objeto JSON que se devolverá para cada documento de entrada.

Ahora hablaremos sobre la función Joins en la base de datos AQL.

Empecemos creando una colección composer_dob… A continuación, crearemos cuatro documentos con la fecha de nacimiento hipotética de los compositores ejecutando la siguiente consulta en el campo de consulta:

FOR dob IN [
   {composer: "Bernie Hanighen", Year: 1909}
 ,
   {composer: "Robert Emmett Dolan", Year: 1922}
 ,
   {composer: "Andre Previn", Year: 1943}
 ,
   {composer: "Harold Arlen", Year: 1910}
]
INSERT dob in composer_dob

Compositor DOB

Para enfatizar la similitud con SQL, presentamos una consulta de bucle FOR anidada en AQL que conduce a una operación REPLACE, iterando primero en el bucle interno, sobre todos los dobs de los compositores y luego sobre todas las canciones relacionadas, creando un nuevo documento que contiene el atributo song_with_composer_key en lugar de canción atributo.

Aquí está la pregunta:

FOR s IN songs
FOR c IN composer_dob
FILTER s.composer == c.composer

LET song_with_composer_key = MERGE(
   UNSET(s, 'composer'),
   {composer_key:c._key}
)
REPLACE s with song_with_composer_key IN songs

Canción con la clave del compositor

Ejecutemos la consulta ahora PARA canción En canciones VOLVER canción nuevamente para ver cómo ha cambiado la colección de canciones.

Salida

[
   {
      "_key": "Air-Minded",
      "_id": "songs/Air-Minded",
      "_rev": "_Vk8kFoK---",
      "Year": 1940,
      "composer_key": "5501",
      "length": 210,
      "lyricist": "Johnny Mercer",
      "title": "Air-Minded Executive"
   },
   
   {
      "_key": "Affable_Balding",
      "_id": "songs/Affable_Balding",
      "_rev": "_Vk8kFoK--_",
      "Year": 1950,
      "composer_key": "5505",
      "length": 200,
      "lyricist": "Johnny Mercer",
      "title": "Affable Balding Me"
   },
   
   {
      "_key": "All_Mucked",
      "_id": "songs/All_Mucked",
      "_rev": "_Vk8kFoK--A",
      "Year": 1974,
      "composer_key": "5507",
      "length": 180,
      "lyricist": "Johnny Mercer",
      "title": "All Mucked Up"
   },
   
   {
      "_key": "Accentchuate_The",
      "_id": "songs/Accentchuate_The",
      "_rev": "_Vk8kFoK--B",
      "Year": 1944,
      "composer_key": "5509",
      "length": 190,
      "lyricist": "Johnny Mercer",
      "title": "Accentchuate The Politics"
   }
]

La consulta anterior completa el proceso de migración de datos agregando composer_key a cada canción.

Ahora, la siguiente consulta es nuevamente una consulta de bucle FOR anidada, pero esta vez conduce a una operación de unión agregando el nombre del compositor asociado (seleccione con composer_key) a cada canción –

FOR s IN songs
FOR c IN composer_dob
FILTER c._key == s.composer_key
RETURN MERGE(s,
{ composer: c.composer }
)

Salida

[
   {
      "Year": 1940,
      "_id": "songs/Air-Minded",
      "_key": "Air-Minded",
      "_rev": "_Vk8kFoK---",
      "composer_key": "5501",
      "length": 210,
      "lyricist": "Johnny Mercer",
      "title": "Air-Minded Executive",
      "composer": "Bernie Hanighen"
   },
   
   {
      "Year": 1950,
      "_id": "songs/Affable_Balding",
      "_key": "Affable_Balding",
      "_rev": "_Vk8kFoK--_",
      "composer_key": "5505",
      "length": 200,
      "lyricist": "Johnny Mercer",
      "title": "Affable Balding Me",
      "composer": "Robert Emmett Dolan"
   },

   {
      "Year": 1974,
      "_id": "songs/All_Mucked",
      "_key": "All_Mucked",
      "_rev": "_Vk8kFoK--A",
      "composer_key": "5507",
      "length": 180,
      "lyricist": "Johnny Mercer",
      "title": "All Mucked Up",
      "composer": "Andre Previn"
   },

   {
      "Year": 1944,
      "_id": "songs/Accentchuate_The",
      "_key": "Accentchuate_The",
      "_rev": "_Vk8kFoK--B",
      "composer_key": "5509",
      "length": 190,
      "lyricist": "Johnny Mercer",
      "title": "Accentchuate The Politics",
      "composer": "Harold Arlen"
   }
]

Agregar una clave de compositor a cada canción

🚫