MongoDB e la quintessenza del document store

13 marzo 2014

Fabrizio Soppelsa

- RHCE, Autore di Linux&C, Autore di Linux Journal

MongoDB è attualmente il NoSQL document-store più diffuso. Ha rimpiazzato come popolarità CouchDB, ed è attualmente parte integrante di importanti implementazioni applicative, come ad esempio Foursquare, Sourceforge, eBay e il CERN di Ginevra, oltre che la base del sistema di autenticazione di OpenShift.

MongoDB fa parte del filone dei vari NoSQL. Ciò significa che supera il principio tipico dei database relazionali (come MySQL): i dati non vengono salvati in tabelle strutturate e collegate. In MongoDB non esistono concetti di tabelle, join, chiavi esterne. MongoDB rimpiazza il concetto di riga con il concetto di documento, e il concetto di tabella con il concetto di collezione. Ogni documento può contenere campi e dati custom diversi dagli altri documenti e un insieme di questi documenti costituisce una collezione. Un insieme di più collezioni con i permessi associati costituisce invece un database. Insomma, in MongoDB si inseriscono i dati senza preoccuparsi di dividerli per adeguarsi alla struttura: si inseriscono e basta. È con le funzionalità messe a disposizione da MongoDB che sarà poi possibile effettuare query, inserire, eliminare o aggiornare questi dati. Ma niente SQL.

Pensare ai documenti non deve creare confusione. I documenti di MongoDB sono dataset “strutturati” con un modello chiave-valore, tipo JSON (JavaScript Object Notation), non documenti di testo o fogli elettronici (benché in MongoDB sia possibile salvare anche questo genere di dato). Per esempio ecco un documento con i miei due numeri di telefono:

{ "nome" : "Fabrizio", "telefono" : [ "3912345678", "3987654321" ] }

Lavorare con MongoDB risulta semplice per i programmatori, che si interfacciano a un’API senza vincoli di schemi software o progettuali prestabiliti, e per gli amministratori, che possono scalarlo verso esigenze superiori con più trasparenza.

Le caratteristiche che contraddistinguono da sempre MongoDB (leggerezza e scalabilità) lo rendono molto adatto per progetti web anche di grande dimensione, agili e scattanti, ma poco adatto ad ambienti dove siano richieste caratteristiche di affidabilità tipiche dei database relazionali più potenti (come PostgreSQL), tipo le transazioni. Detto chiaramente: nessuno farebbe una piattaforma di home banking con MongoDB.

Per installare MongoDB su RHEL o CentOS si procede come al solito, dopo aver abilitato il repository EPEL:

1
# yum install mongodb mongodb-server

Una volta aperta su iptables la porta tcp/27017 e avviato il servizio con

1
# service mongod start

oppure (da RHEL 7, con systemd)

1
# systemctl start mongod

è possibile connettersi al server usando la semplice ma potente shell Javascript (mongo si collega automaticamente al database test):

1
2
3
4
$ mongo
MongoDB shell version: 2.4.6
connecting to: test
>

L’uso tipico di MongoDB consiste nell’inserire, cercare, modificare dati nei database. Sebbene sembra che si usi JSON, internamente MongoDB salva i dati in un cosiddetto JSON binario figlio del progetto MongoDB stesso, denominato BSON:

1
2
3
4
5
6
7
> articolo = { "titolo" : "MongoDB", "contenuto" : "In questo articolo esploreremo MongoDB", "data" : new Date() }
{
"titolo" : "MongoDB",
"contenuto" : "In questo articolo esploreremo MongoDB",
"data" : ISODate("2014-03-12T22:25:56.091Z")
}
> db.articoli.insert(articolo)

MongoDB è un progetto di successo e, anche se di primo acchito il suo approccio così minimale può ammutolire, sposando la filosofia dello strumento-giusto-nel-posto-giusto, può rivelarsi una scelta vincente. Il team di MongoDB non vuole sparare alla mosca con il famoso cannone perciò, anche se sempre più ricco di feature, MongoDB rimarrà fedele alla sua vocazione di document store snello e scattante.

Vedremo in alcuni post successivi come gestire le autorizzazioni su MongoDB, più qualche concetto più avanzato, come i log, i backup e la replica.