Ciao Mongo!

mongodb_logoE’ da un po’ di tempo che sto pensando di mettere le mani su MongoDB e finalmente oggi mi sono sentito Mongo, voglio dire…pronto! Vogliamo provare insieme?

Cos’è MongoDB?

Questo database dal nome bizzarro (deriva dall’aggettivo inglese huMONGOus) è uno fra i più popolari dbms NoSQL e deve il successo alle proprie caratteristiche interessanti: è scalabile, performante, orientato al documento e open source: il compagno ideale per il web developer!

Il movimento NoSQL (che contrariamente a quanto molti pensano sta per Not Only SQL) sta raccogliendo sempre più adepti, uscendo dall’ambito dei core smanettoni e attestandosi come tecnologia matura e stabile: sapete chi se ne sta interessando? Il grande Martin Fowler!

Cosa facciamo?

Proveremo a impostare il server MongoDB e a connetterci a tale database da un progetto Java su IDE Eclipse. Eseguiremo infine qualche operazione di recupero/salvataggio dati. Ricapitolando ci servirà:

  • MongoDB Server
  • MongoDB Java Driver (JDBC Driver)
  • JDK 1.5+
  • IDE Eclipse 3.5+
  • Partiamo!

    Scarichiamo e installiamo il DB Server

    Visitate la pagina dei download di MongoDB per scaricare i binari adatti al vostro sistema operativo. Io mi accingo ad installarlo sul mio nuovissimo Ubuntu 12.04 a 64bit e ho utilizzato il pacchetto (parliamo di poche decine di Mb) disponibile sull’Ubuntu Software Center per installarlo.

    mongodb setup

    Una volta installato il server possiamo visualizzare il suo stato, fermarlo e avviarlo con i comandi seguenti da terminale:

    Start and Stop MongoDB

    Di default il server MongoDB utilizza la porta 27017. E’ disponibile una comoda Console di Amministrazione Web all’url localhost:28017. Questa console si appoggia alle api REST di MongoDB, che tuttavia sono disabilitate di default. Per abilitarle editate il file /etc/mongodb.conf aggiungendo la riga rest=true e provvedete a riavviare il server (sudo restart mongodb). Possiamo fare riferimento alla documentazione per consultare tutte le possibili opzioni supportate inseribili nel file di configurazione.

    Dati in libertà

    Prima di andare ad interrogare e persistere sul DB inseriamo un po’ di dati con cui giocherellare. Diciamo però subito che MongoDB non è un DBMS relazionale, ma orientato al documento. Questo in pratica significa che anziché avere tabelle abbiamo Collezioni, anziché avere righe (o tuple, che fa molto radical chic) abbiamo Documenti, anziché colonne abbiamo Campi. Questi campi non sono predefiniti, come accade per le colonne di una tabella: posso inserire in una Collezione qualunque tipo di dato; chi di voi ha dentro il cuore un DBA si sentirà dentro alla Bastiglia, con orde di Javisti urlanti che appiccano il fuoco ovunque :-). D’altro canto c’è da riconoscere che la flessibilità aggiuntiva dei database NoSQL garantisce un sviluppo iterativo molto agile: addio alter table :-).

> manupia@ubuntu:~$ mongo
MongoDB shell version: 2.0.4
connecting to: test
> use cose
switched to db cose
> cd = {title: "The Wind That Shakes The Barley", artist: "Loreena McKennitt", label: "Verve", genre: "Celtic New Age"};
> dvd = {title: "Gladiator", director: "Ridley Scott", minutes: 155, genre: "Historical", actors: "Russell Crowe, Joaquin Phoenix, Connie Nielsen, Oliver Reed, Richard Harris", language: "English"};
> db.cose.save(cd);
> db.cose.save(dvd);
> for (var i = 1; i <= 5; i++) db.cose.save({x : 4, j : i});

Se ora volessimo tutto il contenuto di cose basta digitare db.cose.find(), nel qual caso otteniamo:

> db.cose.find();
{ "_id" : ObjectId("4f9d75ffda72f5ec8ebfcdd2"), "title" : "The Wind That Shakes The Barley", "artist" : "Loreena McKennitt", "label" : "Verve", "genre" : "Celtic New Age" }
{ "_id" : ObjectId("4f9d786acf7dac9a67bc82d6"), "title" : "Gladiator", "director" : "Ridley Scott", "minutes" : 155, "genre" : "Historical", "actors" : "Russell Crowe, Joaquin Phoenix, Connie Nielsen, Oliver Reed, Richard Harris", "language" : "English" }
{ "_id" : ObjectId("4f9d7a86cf7dac9a67bc82d7"), "x" : 4, "j" : 1 }
{ "_id" : ObjectId("4f9d7a86cf7dac9a67bc82d8"), "x" : 4, "j" : 2 }
{ "_id" : ObjectId("4f9d7a86cf7dac9a67bc82d9"), "x" : 4, "j" : 3 }
{ "_id" : ObjectId("4f9d7a86cf7dac9a67bc82da"), "x" : 4, "j" : 4 }
{ "_id" : ObjectId("4f9d7a86cf7dac9a67bc82db"), "x" : 4, "j" : 5 }

Lo so: il DBA reazionario chiuso nel vostro cuore sta urlando: “JavaScript?, Notazione JSON? Alla ghigliottina!!”

Creiamo il progetto Java in Eclipse

Adesso lanciamo Eclipse (ho usato la Indigo Service Release 2) e utilizzando la JDK 6: siccome sono un ragazzo creativo per il nome del progetto ho scelto CiaoMongo.

Scarichiamo i Driver MongoDB JDBC

Ci serve ancora un’ultima cosa prima di scrivere un po’ di buon vecchio Java: dobbiamo scaricare i Driver JDBC per MongoDB: il jar (attualmente alla versione 2.7.3) non raggiunge i 300Kb. Copiamo il file sotto una cartella lib all’interno del progetto e cliccando di destro scegliamo Add to Build Path.

Java, ci mancava!

Scriviamo ora il codice Java che si occuperà di interagire col database MongoDB:

package it.cosenonjaviste.ciaomongo;
import java.net.UnknownHostException;

public class CiaoMongoApp {
        public static void main(String[] args) {
                try {
                        Mongo mongo = new Mongo("127.0.0.1", 27017);
                        DB db = mongo.getDB("cose");
                        DBCollection collection = db.getCollection("libriCollection");

                        // inserisco un libro
                        BasicDBObject document = new BasicDBObject();
                        document.put("isbn", 1935182870);
                        document.put("titolo", "MongoDB in Action");
                        document.put("autore", "Kyle Banker");
                        collection.insert(document);

                        // ora lo vado a ricercare
                        BasicDBObject searchQuery = new BasicDBObject();
                        searchQuery.put("isbn", 1935182870);
                        DBCursor cursor = collection.find(searchQuery);
                        while (cursor.hasNext()) {
                                System.out.println(cursor.next());
                        }
                        System.out.println("Done");
                } catch (UnknownHostException e) {
                        e.printStackTrace();
                } catch (MongoException e) {
                        e.printStackTrace();
                }
        }
}

Se tutto ha funzionato correttamente dovremmo vedere in console:

{ "_id" : { "$oid" : "4fcb1cf3e4b099a8761d75c0"} , "isbn" : 1935182870 , "titolo" : "MongoDB in Action" , "autore" : "Kyle Banker"}
Done

Conclusioni

Abbiamo oggi aggiunto un nuovo piccolo ma potente strumento al coltellino svizzero del web developer. Avremo modo in uno dei prossimi post di approfondire insieme altre caratteristiche e potenzialità di MongoDB.

Alla Prossima!

Riferimenti

Manuele Piastra

Sono uno Scrum Master e Project Manager i cui skill tecnici sono focalizzati al momento sullo sviluppo di applicazioni Java EE su IBM Websphere 7.0 utilizzando JSF (RichFaces), JPA (EclipseLink) ed EJB3. Presso OmniaGroup ricopro il ruolo di Training Manager: seleziono il personale tecnico, mi occupo della sua crescita formativa organizzando Corsi e Workshop sia interni che esterni, molti dei quali hanno visto me come docente. -

  • Fabrizio

    …articolo semplice e conciso! 🙂 Well done!

    • Ciao Fabrizio, ti ringrazio, continua a seguirci… 🙂

  • Maurizio Cozzetto

    Tutorial utile. Ma come faccio a farmi dare i singoli campi (isbn, titolo, autore ecc) dall’oggetto json? In un vero programma la notazione json è improponibile.

    Grazie.

    • Manuela

      Estrarre i singoli campi dall’oggetto json che restituisce il db è molto semplice:
      dal cursor, tramite la cursor.next(), ottieni un DBObject; da questo, tramite dbObj.get(“isbn”) ottieni il valore associato alla specifica key del json.
      Usare la notazione json in Java non è molto agile, mentre per esempio in NodeJS (essendo appunto javascript) lo usi che è un piacere, sfruttando la dot-notation!

      • ospite

        Innanzitutto grazie per il chiarissimo articolo.Dato che mongoDB restituisce un JSON, perchè non utilizzare Jackson per mapparlo su delle classi (Bean) e utilizzare getter e setter per accedere in lettura e scrittura ai singoli campi?
        Ciao.

  • Pingback: ()

  • Marco Di Iorio

    salve, volevo sapere se esiste mongodb workbench cosi poi faccio il dump del database senza utilizzare dbmongo server.
    Grazie