
Le aziende e le organizzazioni sono alla ricerca di nuovi metodi per gestire il flusso di dati e sono attratte da strumenti e sistemi di gestione del database alternativi che sono diversi dai tradizionali sistemi di database relazionali.
Uno di questi sono certamente i database NoSql, che vengono utilizzati per gestire al meglio i dati generati dagli utenti, i dati sulla posizione geografica, i dati generati dall’Internet of Things (IoT o Internet delle cose), i grafici sociali, dati che nel mondo reale sono aumentati esponenzialmente. Usando il database NoSQL possiamo archiviare e gestire documenti, valori-chiave, dati basati su grafici in modo facile e veloce. Possiamo facilmente evitare complesse operazioni di join SQL.
In questo articolo vediamo MongoDB, un tipo di database NoSql, e come si differenzia rispetto ai classici database relazionali.
Cos’è MongoDB?
MongoDB è un sistema di gestione di database (DBMS) open source orientato ai documenti e che supporta varie forme di dati.
È una delle numerose tecnologie di database non relazionali nate a metà degli anni 2000 sotto l’etichetta NoSQL per l’uso in applicazioni big data e altri processi di elaborazione che coinvolgono dati che non si adattano bene a un modello relazionale rigido.
MongoDB è stato creato da Dwight Merriman ed Eliot Horowitz, quando avevano riscontrato problemi di sviluppo e scalabilità con i tradizionali approcci di database relazionali durante la creazione di applicazioni web presso DoubleClick, una società di pubblicità online ora di proprietà di Google.
Il nome del database deriva dalla parola gigantesca per rappresentare l’idea di supportare grandi quantità di dati.
Essere uno strumento NoSQL significa che non utilizza le solite righe e colonne che si associano così tanto alla gestione del database relazionale. È un’architettura che si basa su raccolte e documenti, come possiamo vedere meglio dal prossimo paragrafo.
Architettura MongoDB: come sono organizzati i dati?
Per comprendere al meglio come MongoDB lavora è bene avere chiaro i concetti su cui esso si basa.
Innanzitutto, con RDBMS (Relational Database Management Systems) abbiamo database, tabelle, righe e colonne. Sono i classici database relazionali.
Ma nei database NoSQL, come MongoDB, i dati sono archiviati in strutture chiamate “collezioni“.
Dette anche raccolte, le collezioni contengono insiemi di documenti e funzionano come l’equivalente delle tabelle del database relazionale.
I campi nei documenti sono simili alle colonne di un database relazionale e i valori in essi contenuti possono essere una varietà di tipi di dati, inclusi altri documenti, secondo il manuale dell’utente MongoDB.
Un record in MongoDB è un documento, che è una struttura di dati composta da coppie di campi e valori. I documenti, che devono anche includere una chiave primaria come identificatore univoco, sono l’unità di base dei dati in MongoDB. Sono rappresentate dalle righe nei database relazionali.
La dimensione massima di un documento è di 16 MB, ma MongoDB utilizza GridFS per contenere documenti più grandi.
Infine si ha il Database: in parole semplici, può essere chiamato il contenitore fisico per i dati. Ciascuno dei database ha il proprio set di file sul file system con più database esistenti su un singolo server MongoDB.
Scalabilità dei dati
La scalabilità è una caratteristica di un sistema che descrive la sua capacità di funzionare con un carico di lavoro maggiore. Un sistema che si adatta bene sarà in grado di mantenere e aumentare il suo livello di prestazioni in caso di maggiori esigenze operative.
I database relazionali solitamente utilizzano un approccio di ridimensionamento dei dati di tipo verticale. Ciò significa che si collegano ad un singolo server e man mano che vengono gestiti più dati, viene aggiunto più spazio di archiviazione o aggiornata ad una CPU più potente con una maggiore RAM per gestire il carico di lavoro.
Il server rimane uno, al limite diventa più grande.
Al contrario MongoDB utilizza una forma di ridimensionamento orizzontale chiamata sharding, che permette di distribuire i dati su più macchine e facilitare operazioni ad alta produttività con grandi serie di dati, invece di affidarsi a un singolo server ad alta velocità e alta capacità.
In questo modo è possibile fornire agli amministratori di sistema la possibilità di aumentare la capacità al momento richiesto, definendo solamente quante macchine possono essere connesse correttamente.
Alta disponibilità dei dati
Oltre al ridimensionamento orizzontale MongoDB garantisce un’alta disponibilità dei dati. Questo avviene tramite il processo di sincronizzazione dei dati tra più server (detto replica), in modo da avere più copie dei dati su diversi server di database.
Tramite la replica è possibile proteggere un database dalla perdita di un singolo server, di ripristinarlo da guasti hardware e interruzioni del servizio. Con copie aggiuntive dei dati, è possibile inoltre dedicarne uno al ripristino di emergenza, ai report o al backup.
In MongoDB si ha un set di repliche formate da due o più nodi (almeno 3 nodi di solito). Uno di questi è il nodo primario e i nodi rimanenti sono secondari.
Tutti i dati vengono replicati dal nodo primario a quelli secondari, per i motivi accennati poco fa. Al momento del guasto del server o della manutenzione, viene eletto un nuovo nodo primario. Il nodo guasto, si unisce nuovamente al set di repliche e funziona come nodo secondario.
Viene mostrato un diagramma tipico della replica di MongoDB in cui l’applicazione client interagisce sempre con il nodo primario e il nodo primario replica quindi i dati sui nodi secondari.
MongoDB Query Language (MQL)
In MongoDB, i documenti sono rappresentati da file BSON, un’estensione dei file JSON (JavaScript Object Notation) che aiuta a fornire tipi di dati aggiuntivi, campi ordinati e maggiore efficienza per la codifica e la decodifica in lingue diverse.
JavaScript Object Notation (JSON) è uno standard leggibile da una macchina che facilita lo scambio di dati e insieme a XML è il formato principale per lo scambio di dati utilizzato sul web moderno.
Si vuole ricordare anche che un file JSON può essere facilmente analizzato, con poca o nessuna trasformazione, direttamente da JavaScript e dai linguaggi di programmazione più diffusi.
Quindi per MongoDB risulta semplice archiviare e rappresentare questi formati.
Una volta creata una collezione e salvati all’interno dei documenti, è possibile sfruttare MongoDB per estrarre informazioni tramite un’interfaccia JavaScript interattiva, lo shell Mongo. Esso consente agli utenti di eseguire query e aggiornare i dati e condurre operazioni amministrative, come l’inserimento di codice JavaScript.
Tuttavia, i comandi MongoDB possono diventare piuttosto veloci, quindi funzionalità come il completamento automatico delle query per far risparmiare tempo all’utente.
La shell è un componente standard delle distribuzioni open source di MongoDB, e una volta installato il database NoSql, permette agli utenti di collegarsi dallo shell stesso alle loro istanze MongoDB in esecuzione.
Comandi più comuni utilizzati
Vediamo ora alcuni dei comandi più comuni utilizzati da chi utilizza MongoDB.
Accedi a MongoDB
Per utenti esistenti in un database:
Use dbName
db.auth(“userName”, “password”)
Esci da MongoDB
db.logout()
Lista di tutti i database
Show dbs
Crea un database
Use dbName
Viene utilizzato per creare il database. Il comando creerà un nuovo database se non esiste, altrimenti restituirà il database esistente.
Visualizza il database corrente
db
Elimina un database
db.dropDatabase();
Si noti che questo comando non richiede il nome del database che si intende eliminare; semplicemente elimina il database corrente in cui ci si trova.
Quindi, la prima cosa che devi fare è cambiare il database che vuoi eliminare, in questo modo:
use dbName
db.dropDatabase()
Creare un utente
La prima attività è quella di definire il database dove si vuole creare l’utente.
Use dbName
Poi è possibile creare l’utente
db.createUser({
user : ‘< userName >’,
pwd : ‘< password >’,
roles : [ { role : ‘< roleName >’, db : ‘< dbName >’ } | ‘< roleName >’, …]
})
Cancellare un utente
Anche in questa fase è importante definire il database dove si vuole cancellare l’utente.
db.dropUser(‘< userName >’)
Assegnare un ruolo ad un utente
Come avrai notato, è già possibile concedere ruoli quando si aggiunge un nuovo utente.
Ma nel caso in cui sia necessario farlo in seguito, eseguire il comando:
db.grantRolesToUser(
‘< userName >’,
[ { role : ‘< roleName >’, db : ‘< dbName >’ }, ‘< roleName >’, … ]
)
Revocare un ruolo ad utente
Allo stesso modo è possibile togliere un ruolo all’utente eseguendo il seguente comando:
db.revokeRolesFromUser(
‘< userName >’,
[ { role : ‘< roleName >’, db : ‘< dbname >’ } | ‘< roleName >’ ]
)
Creare una collezione
Anche se MongoDB crea la prima collezione quando inseriamo dei documenti, puoi crearne altre tramite il comando:
db.createCollection(“collectionName”)
Eliminare una collezione
db.collection_name.drop()
Inserire un singolo documento in una raccolta
db.collectionName.insert({ field1: “value1”, field2: “value2” })
Inserire più di un documento in una raccolta
db.collectionName.insertMany([{field1: “value1”}, {field1: “value2”}])
Lista dei documenti in una collezione
db.collectionName.find()
Modifica di un singolo documento in una collezione
db.collection.updateOne(< filter >, < update >, < options >))
Modifica di più documenti in una collezione
db.collection.updateMany(< filter >, < update >, < options >)
Cancella tutti i documenti da una collezione
db.collection.deleteMany()
Muovere i primi passi con MongoDB
In questo articolo abbiamo visto cos’è MongoDB e alcune caratteristiche che lo differenziano rispetto ai database relazionali.
Semplicemente, MongoDB è un database veloce e affidabile consigliato a chi voglia progettare applicazioni Web scalabili, che richiedevano l’archiviazione di dati non strutturati.
È adatto in tutte quelle situazioni in cui si vuole progettare un’applicazione dove è richiesta elevata disponibilità, clustering e prestazioni veloci.
Per maggiori informazioni, e se vuoi migliorare e/o apprendere competenze nell’utilizzare questo potente strumento puoi affidarti a: