Le SGBD NoSQL Marklogic 8 dispose d’une API Node.js, qui permet de développer rapidement de petites (ou puissantes ?) applications Web.
Partons du principe que vous avez installé Node.js (version 0.12.7) le jour où j’écris ces lignes, et que vous commencez à savoir vous en servir. Vous trouverez sur le What’s new de Marklogic 8 une introduction sur l’intégration de Node.js dans ce produit.
Installation du client
Sur npm, vous trouverez un client marklogic officiel, que vous installerez via la commande
$ npm install marklogic
Vous obtiendrez un warning lors de l’installation :
npm WARN engine marklogic@1.0.1: wanted: {"node":">=0.10.26 <0.11"} (current: {"node":"0.12.0","npm":"2.5.1"})
Mais vous trouverez sur stackoverflow et sur le github marklogic de quoi vous rassurer.
Premiers essais
Vos premiers essais seront basés sur le document « Getting Started with the Node Client API » du site Marklogic.
Le code est simple, lisible. Il suffit de charger le client marklogic, la configuration de connexion placée dans un fichier js, et d’appeler une méthode de connexion.
var marklogic = require("marklogic"); var conn = require("./env.js").connection; var db = marklogic.createDatabaseClient(conn);
Ensuite, on insère un ou plusieurs documents dans la base via :
db.documents.write(object(s))
La seule chose qui me gène un peu est la syntaxe utilisée pour la récupération des résultats :
db.documents.write(object(s)).result(callback-ok, callback-err);
Là où l’implémentation monk/mongoDB propose une syntaxe qui me semble plus classique pour node.js (mais je suis nouveau dans ce domaine) :
collection.insert(object, callback);
Ingestion de documents JSON dans la base
Voici le code qui me sert à faire ingérer à Marklogic des lots de documents stockés dans des fichiers JSON dont le chemin est passé en paramètre du script. Chaque fichier contient un array d’objets.
var marklogic = require("marklogic"); var conn = require("./env.js").connection; var fs = require('fs'); // récupère le paramètre = chemin du fichier json contenant les documents if (process.argv.length < 3) return console.log("missing file path") file = process.argv[2]; // lit le ficher entièrement. // pas de stream pour pouvoir facilement décomposer l'array fs.readFile(file, 'utf8', function(err, jsondata){ if (err) { return console.log(err); } // crée la connexion MArklogic var db = marklogic.createDatabaseClient(conn); // transforme les données du ficher en array data = JSON.parse(jsondata) // sauve chaque élément de l'array, avec ses métadonnées db.documents.write( data.map(function(item) { return { uri: "/" + item.fr.uuid + ".json", contentType: "application/json", collections: ["uc-films"], content: item } }) ) // message d'erreur .result(null, function(error) { console.log(JSON.stringify(error)); }); });
L’uri de chaque item est ici le contenu de le la propriété uuid de l’objet fr. A vous d’adapter à votre format d’import.
Test avec qconsole
Dans un browser, ouvrez http://localhost:8000/qconsole et entrez comme query :
xquery version "1.0-ml"; cts:search(/fr/name,cts:collection-query("uc-films"))
Dans mon cas, j’obtiens une liste de titres de films, ce qui illustre la possibilité de requêter des documents JSON avec des requêtes XQuery (ici une simple expression XPath). Sympa, non ? Vous trouverez plus de détails sur le maniement de JSON dans Marklogic sur la page Working with JSON de la documentation Marklogic.
A vous d’adapter le chemin XPath à votre format de document.
Référence
« Node.js Application Developer’s Guide« .