Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

I Driver

Per gli sviluppatori esistono diversi Driver per MongoDB, per l'interfacciamento con il database dai più diffusi linguaggi di programmazione: Java, .NET, PHP, JavaScript.
Per gli sviluppatori esistono diversi Driver per MongoDB, per l'interfacciamento con il database dai più diffusi linguaggi di programmazione: Java, .NET, PHP, JavaScript.
Link copiato negli appunti

Finora abbiamo visto MongoDB dal lato dell’utente; ora vediamo come possiamo usarlo da sviluppatori.

Sebbene MongoDB disponga di un protocollo non troppo complesso per l’invio di interrogazioni e comandi e per restituire i risultati, per i più importanti e utilizzati linguaggi di programmazione sono state realizzate delle librerie (o Driver, come si dice nell’ambito della gestione di database) per l’interfacciamento con MongoDB in modo semplice e intuitivo. Ciò solleva il programmatore dalla necessità di studiare il protocollo e di implementare tutta l’infrastruttura di conversione dati. Naturalmente, non essendo un database relazionale, non esiste uno strato di astrazione tipo JDBC o ADO.NET, quindi il Driver va usato direttamente, con l’eccezione di LINQ in .NET. Tuttavia esistono anche implementazioni commerciali ed open source di drivers ODBC per MongoDB su cui non ci soffermeremo.

La maggior parte dei Driver cercano di dare allo sviluppatore un API il più possibile fedele a quella della console mongo che abbiamo visto in precedenza. Quindi non ci soffermeremo sui singoli comandi, ma vedremo come si installano i Driver ufficiali più usati su MongoDB e le loro peculiarità rispetto alla console. Per una lista di tutti i Driver ufficiali, e per accedere al codice sorgente, si può consultare la documentazione online di MongoDB.

Java

Il driver per Java (e in generale per tutti i linguaggi JVM) si chiama mongo-java-driver. Si può scaricare dalla URL ufficiale e inserirlo nel Build Path, ma il metodo migliore è
probabilmente usare Maven, aggiungendo la seguente dipendenza nel file pom.xml della nostra applicazione.

<dependency>
   <groupId>org.mongodb</groupId>
   <artifactId>mongo-java-driver</artifactId>
   <version>2.12.0</version>
 </dependency>

Per iniziare bisogna creare una connessione a MongoDB:

import com.mongodb.*;
...
MongoClient client = new MongoClient("localhost");
DB db = client.getDb("libri");
DBCollection autori = db.getCollection("autori");

La classe MongoClient in realtà gestisce un pool di connessioni a MongoDB ed è thread-safe. Ciò significa che se usiamo MongoDB in un’applicazione multithread, possiamo usare sempre la stessa istanza di MongoClient senza incorrere in problemi di concorrenza. La classe DbCollection contiene i metodi necessari per agire sulla collezione, che corrispondono grosso modo ai metodi forniti dalla shell:

BasicDBObject dante = new BasicDBObject()
   .append("nome", "Dante")
   .append("cognome","Alighieri");
   .append("nato", 1265);
autori.insert(dante);

Possiamo notare che abbiamo dovuto creare un oggetto BasicDBObject per definire un documento. Con il driver Java ufficiale, infatti, i documenti sono tutti modellati come istanze di questa classe e utilizzano il metodo append per definire i campi dei documenti. Questo perché ovviamente Java è un linguaggio staticamente tipizzato, quindi non possiamo referenziare i campi direttamente.

.NET (C# e VB.NET)

L’ultima versione del driver per .NET può essere anch’esso scaricato dalla pagina ufficiale oppure, più semplicemente, con NuGet, digitando direttamente nella Package Manager Console il comando:

[code] Install-Package mongocsharpdriver [/code]

Il punto di ingresso è la classe thread-safe MongoClient, che gestisce autonomamente un pool di connessioni ad un server MongoDB. Tramite questa classe si accede ad un oggetto di tipo MongoServer che, a sua volta, gestisce una connessione e permette di selezionare uno o più database. Per esemplificare, se vogliamo accedere alla collection autori, nel database libri, in C# 3.5 possiamo scrivere:

var autori = new MongoClient().GetServer().GetDatabase("libri").GetCollection<BsonDocument>("autori");

La classe BsonDocument ha un comportamento simile ad una struttura dati a dizionario, e permette di definire dinamicamente i campi. Ad esempio, in C#:

var dante = new BsonDocument {
   { "nome", "Dante" },
   { "cognome", "Alighieri" },
};

Il driver di .NET permette anche di definire delle classi che si possono mappare in documenti MongoDB, proprio come si può fare con un ORM di un database relazionale. È necessaria, oltre alle definizione della classe, la mappatura della stessa:

public class Autore {
   public String Nome { get; set; }
   public String Cognome { get; set; }
}
BsonClassMap.RegisterClassMap<Autore>(classMap => classMap.AutoMap());

La registrazione va fatta una volta sola, prima dell’utilizzo. Nell’esempio viene usato il metodo AutoMap, che registra la mappatura delle proprietà pubbliche automaticamente. Chiaramente questo approccio vincola lo sviluppatore ad utilizzare collezioni di oggetti con una struttura prefissata, ma solo a livello applicazione, senza avere nessuna garanzia che i dati sul server MongoDB avranno sempre tale struttura: sarà cioè sempre possibile accedere a MongoDB tramite console o qualche altro driver, e aggiungere documenti non strutturati.

L’aspetto più peculiare del driver .NET è comunque il provider LINQ. Esso fornisce un layer integrato e, a meno di errori di mappatura, type-safe per l’utilizzo di sorgenti dati come database SQL, file XML, collezioni di oggetti in memoria, etc. Per ottenere un riferimento ad un oggetto IQueryable (l’interfaccia usata da LINQ), si parte da una collection:

var autori = new MongoClient().GetServer().GetDatabase("libri").GetCollection<Autore>("autori");
var query = autori. AsQueryable<Autore>().Where(a => a.Nome == "Dante").ToArray();

In questo modo si è incapsulata una chiamata al metodo find dentro una chiamata LINQ. Se si è usato LINQ in un’applicazione per database
relazionali, si può migrare a MongoDB sicuramente con meno fatica rispetto all’utilizzo di ADO.NET.

PHP

Per installare il driver per questo linguaggio di programmazione, è necessario installare l’estensione php_mongo.dll oppure mongo.so, a
seconda se siamo sotto Windows o Linux:

[code]
extension=mongo.so // Linux
extension=php_mongo.dll // Windows
[/code]

Naturalmente dobbiamo anche scaricare la libreria; possiamo farlo tramite il sito dedicato per Windows, oppure con PEAR:

[code] pecl install mongo [/code]

A questo punto per interagire con MongoDB utilizzando l’oggetto Mongo:

$mongo = new Mongo("mongodb://localhost");
$autori = $mongo->libri->autori;
$dante = array('nome' => 'Dante', 'cognome' => 'Alighieri');
$autori->save($dante);

Come si vede dall’esempio, PHP permette di referenziare database e collezioni direttamente con il nome rendendo semplice la lettura. I documenti invece
vengono memorizzati in array associativi. Per il resto l’utilizzo delle API è abbastanza simile ai metodi della console. È degno di nota il fatto
che il metodo find non restituisce direttamente i documenti trovati, ma un cursore che è necessario scorrere:

$cursore = $autori->find(array('nome' => 'Dante'));
foreach ($cursore as $autore) {
   // … Ad ogni iterazione viene caricato un documento da MongoDB.
}

Rimandiamo al sito ufficiale per l’elenco completo delle classi e dei metodi.

JavaScript

MongoDB fornisce un driver per JavaScript lato server ossia per Node.js, il noto framework JavaScript che utilizza Google
V8 come parser nativo.

Per installarlo si usa il packet manager di Node.js, npm:

[code] npm install mongodb [/code]

Come consuetudine per molte librerie JavaScript, l’API di questo driver è event-driven. Ad esempio, per accedere ad una collection su un database di MongoDB la sintassi è la seguente:

var client = require('mongodb').MongoClient;
client.connect("mongodb://localhost:27017/libri", function(error, libri) {
   if(! error) {
      var autori = libri.collection("autori");
      autori.insert({ nome: "Umberto", cognome: "Eco" }, function(errorIns, risultatoIns) {  });
      db.close();
   }
});

Quindi ogni metodo, piuttosto che restituire qualche oggetto, accetta come parametro una callback, a cui viene passato un eventuale errore rilevato durante l’elaborazione, oppure il risultato. La pagina ufficiale del progetto riporta ulteriori dettagli e il codice sorgente del driver.

Per quanto riguarda l’utilizzo di JavaScript lato client, non esiste un driver. Se si ha l’esigenza di interfacciarsi con JavaScript da una pagina web a MongoDB, bisogna passare per un servizio REST. L’approccio quindi è di installare un’interfaccia REST tra quelle disponibili, in base alle proprie preferenze di framework, di piattaforma o di caratteristiche, quindi effettuare una chiamata AJAX al servizio REST. Ad esempio, se scegliamo di usare Crest, possiamo consumare il servizio con jQuery:

$ (function() {
  var query = { name: "Dante" };
  $.ajax( { url: encodeUri("http://localhost/libri/autori?query=" + JSON.stringify(query) ) })
    .done(function(risultato) {
        // fai qualcosa con il risultato della query
    } );
}

Chiaramente, il tipo di interfaccia o di URL dipenderà dall’implementazione del servizio REST scelta.

Ti consigliamo anche