f4b1.com
***

Comment utiliser AQL avec ArangoDB : INSERT, UPSERT, UPDATE, REPLACE, DELETE
fabien on 07/20/2016 07:57:56 updated on 07/20/2016 08:14:57



Il y a quelques jours, je vous parlais de ArangoDB, une base de données NoSQL qui est très pratique à utiliser et notamment grâce au ArangoDB Query Language (AQL).Il est possible d'utiliser ArangoDB dans de nombreux contextes techniques via les drivers proposés qui sont disponibles dans les langages de programmation les plus courants.

Après avoir fait une petite présentation de ArangoDB et un petit tutoriel pour son installation sur la distribution Linux Ubuntu, nous allons maintenant voir comment utiliser cette base de données NoSQL et surtout interagir avec elle. La manipulation des données est un élément essentiel et justement sous ArangoDB cela est facilité avec le AQL qui se rapproche de ce qui se fait avec le langage de requêtes SQL, l'idée est la même mais la syntaxe est différente, évidemment.

Pour ce premier article concernant ArangoDB et surtout le langage l'AQL, je vais me concentrer sur les requêtes simples, nous verrons l'utilisation des filtres dans un prochain tutoriel pour cibler de façon précise les données sans passer par la clé par exemple. La même collection sera utilisé tout au long de ce tutoriel, il s'agit de tuto d’où l'utilisation des lignes "IN tuto".

Requête INSERT

Cette requête INSERT est la plus basique et c'est la première que nous allons utiliser pour ce tutoriel, elle permet d’insérer des données mail et name dans la collection tuto.

  1. INSERT { mail: 'email@ndd.com', name: 'fabien'} IN tuto

Requête UPDATE

Comme pour SQL, le UPDATE permet de mettre un enregistrement à jour par une nouvelle donnée plus fraiche. Pour trouver l’occurrence à mettre à jour et par souci de simplicité pour le moment, nous allons cibler une clé parmi notre collection, les data derrière cette clé seront alors mise à jour.

  1. UPDATE { _key : '3073189550309' }
  2. WITH { mail: 'newemail@ndd.com' }
  3. IN tuto
  4. RETURN { OLD: OLD, NEW: NEW }

Pour que ce soit plus explicite et c'est le cas pour les exemples de requêtes AQL suivantes, j'ai ajouté la ligne RETURN { old: OLD, new: NEW } qui permet de voir ce qui à changé via notre requête :

  1. [
  2. {
  3. "old": {
  4. "name": "fabien",
  5. "mail": "email@ndd.com",
  6. "_id": "tuto/3073189550309",
  7. "_rev": "3073189550309",
  8. "_key": "3073189550309"
  9. },
  10. "new": {
  11. "name": "fabien",
  12. "mail": "newemail@ndd.com",
  13. "_id": "tuto/3073189550309",
  14. "_rev": "3073192040677",
  15. "_key": "3073189550309"
  16. }
  17. }
  18. ]

Requête INSERT/UPSERT 

Cette requête produit quelque chose de similaire à un UPDATE basique, mais vous n'êtes pas obligé d'utiliser la clé du document pour mettre à jour votre donnée. C'est possible sans utiliser les filtres "FILTER" que nous verrons plus tard comme je l'ai dit précédemment.

Ceci est possible grâce au UPSERT qui va nous permettre d'aller cibler le bon document. Vous souvenez de notre premier INSERT tout à l'heure ?  Nous allons mettre à jour ce document avec la requête suivante et même ajouter un tableau dans le UPDATE. Attention, j'ai gardé les données précédentes, car sinon tout est écrasé par le UPDATE. En d'autres termes, si j'avais seulement renseigné le tableau, il n'y aura plus que lui après le UPDATE dans notre document.

  1. UPSERT { mail: 'email@ndd.com' }
  2. INSERT { }
  3. UPDATE { mail: 'email@ndd.com', name: 'fab1', arrayinfo: [{stringheader:'value15258'}]}
  4. IN tuto
  5. RETURN { OLD: OLD, NEW: NEW }

Le résultat est alors le suivant :

  1. [
  2. {
  3. "old": {
  4. "name": "fabien",
  5. "mail": "email@ndd.com",
  6. "_id": "tuto/3073129912549",
  7. "_rev": "3073129912549",
  8. "_key": "3073129912549"
  9. },
  10. "new": {
  11. "name": "fab1",
  12. "mail": "email@ndd.com",
  13. "arrayinfo": [
  14. {
  15. "stringheader": "value15258"
  16. }
  17. ],
  18. "_id": "tuto/3073129912549",
  19. "_rev": "3073131223269",
  20. "_key": "3073129912549"
  21. }
  22. }
  23. ]

Requête UPSERT avec l'utilisation de .OLD

Dans cet exemple, vous pouvez voir que l'on peut contourner le problème que nous avons rencontré avec le précédent UPDATE. En effet il fallait ajouter les anciennes données dans le UPDATE pour ne pas écraser le contenu de notre document. Il est possible de faire autrement en utilisant la fonctionnalité .OLD de ArangoDB qui va nous permettre de garder les anciennes données du document en plus d'ajouter les nouvelles.

  1. UPSERT { mail: 'email@ndd.com' }
  2. INSERT { }
  3. UPDATE { arrayinfo: PUSH(OLD.arrayinfo, 'monajout',TRUE) }
  4. IN tuto
  5. RETURN { OLD: OLD, NEW: NEW }

Ce qui nous donne ensuite :

  1. [
  2. {
  3. "old": {
  4. "name": "fab1",
  5. "mail": "email@ndd.com",
  6. "arrayinfo": [
  7. {
  8. "stringheader": "value15258"
  9. }
  10. ],
  11. "_id": "tuto/3073129912549",
  12. "_rev": "3073131223269",
  13. "_key": "3073129912549"
  14. },
  15. "new": {
  16. "name": "fab1",
  17. "mail": "email@ndd.com",
  18. "arrayinfo": [
  19. {
  20. "stringheader": "value15258"
  21. },
  22. "monajout"
  23. ],
  24. "_id": "tuto/3073129912549",
  25. "_rev": "3073135417573",
  26. "_key": "3073129912549"
  27. }
  28. }
  29. ]

Requête REPLACE

Cette requête ressemble un peu au UPDATE lorsque l'on reste dans des choses simples. Ici, UPDATE c'est uniquement pour remplacer du contenu dans un document et pas pour le mettre à jour avec des données en plus tout en gardant les anciennes. L'ancien contenu sera donc totalement remplacé par le nouveau en ciblant sur une clé d'un document par exemple.

  1. REPLACE { _key: "3073189550309" }
  2. WITH {
  3. name: "fab_replace",
  4. DATA: "bigdata"
  5. }
  6. IN tuto
  7. RETURN { OLD: OLD, NEW: NEW }

Cela renvoie le résultat suivant :

  1. [
  2. {
  3. "old": {
  4. "name": "fabien",
  5. "mail": "email@ndd.com",
  6. "_id": "tuto/3073189550309",
  7. "_rev": "3073189550309",
  8. "_key": "3073189550309"
  9. },
  10. "new": {
  11. "name": "fabien",
  12. "mail": "newemail@ndd.com",
  13. "_id": "tuto/3073189550309",
  14. "_rev": "3073192040677",
  15. "_key": "3073189550309"
  16. }
  17. }
  18. ]

Requête DELETE

Je termine cette petite introduction au AQL de ArangoDB avec le REMOVE qui va vous permettre de supprimer un document, voici un petit exemple en utilisant la clé d'un document dans la collection tuto. 

  1. REMOVE { _key:"3073189550309" }
  2. IN tuto



Comments


You must be loged to add a comment !