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 creiamo un progetto Java 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

37 Posts

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. LinkedIn Profile - Google+