Capitolo 1

MongoDB in un'App


Capitolo 1: Introduzione e Basi


Introduzione database no-SQL
Join, Transaction e Pre-Join
MongoDB in un'App
Come installare MongoDB
JSON e BSON
Schema Dinamico
Da Relazionale ai Documenti
Schema Design

MongoDB in un'App

Riassumiamo le caratteristiche principali di MongoDB, vedremo la sua nuova terminologia e introdurremo la shell e i drivers.

Cos'è MongoDB?

Cerchiamo di riassumere le caratteristiche principali di Mongo e nel mentre vediamo qualche esempio.


Abbiamo detto che MongoDB è un database non relazionale orientato agli oggetti che usa la codifica json, fin qui nulla di nuovo, non fatevi spaventare da BSON, tra poco vedremo cos’è.

Facciamo un rapido esempio, convertiamo una comune tabella degli animali su MongoDB.

Mongo è “schemaless” ovvero senza schema, per essere più precisi diciamo che ha uno schema dinamico in cui ogni documento ha una sua struttura che può essere modificata in qualsiasi momento. Questo vuol dire che se volessimo aggiungere qualche attributo in più al delfino, come ad esempio in quali oceani vive, non dovremmo far altro che aggiungere una nuova lista di stringhe con i vari oceani.


Questo passaggio così banale è allo stesso tempo fortemente innovativo, se fossimo in un database relazionale avremmo dovuto creare due nuove tabelle, una per inserire i vari oceani e l’altra per inserire la relazione tra oceani e animali, che però sarebbero state inutili per la pantera!

La flessibilità di Mongo ci permette di avere attributi diversi per ogni singolo documento, cosa impensabile nei database relazionali! Possiamo, quindi, aggiungere liberamente alla nostra pantera attributi più caratteristici come il numero di zampe o le nazioni in cui vive, senza dare alcun fastidio agli attributi del delfino, che si trova in un altro documento.


In ogni lezione ripetiamo che il primo obiettivo di Mongo è la scalabilità quindi, ovviamente, ci deve offrire degli strumenti per sfruttarla; ce ne offre due, uno più importante dell’altro, e sono la Replication e lo Sharding.

Con Replication intendiamo la replica fisica dei dati tra un server primario e dei server secondari. Mongo si preoccupa di tenere i dati sincronizzati e nel caso il server primario risulti irraggiungibile elegge automaticamente un server secondario per prendere il suo posto.

Sharding deriva da shard che vuol dire frammento, scheggia, lo sharding ci permette di separare il nostro database su più server, e sarà Mongo stesso a preoccuparsi di distribuire e tenere costantemente bilanciati i dati.


Inoltre abbiamo detto che Mongo è ricco di funzionalità tra le quali gli indici di ricerca, le query geospaziali, il map reduce, gli strumenti per effettuare ricerche sul testo e un sistema di aggregazione dei risultati.


Ci offre davvero tantissimi strumenti che non possiamo approfondire come vorrei. Queste lezioni sono solo un esperimento, una guida basica e introduttiva al magico mondo di MongoDB, quindi mi dispiace ma non vedremo nulla di “avanzato”, niente replication, niente sharding e niente strumenti per i particolari tipi di query! Ma non vi preoccupate c’è tanto di cui parlare ugualmente.

Fino ad ora abbiamo sempre usato il termine tabella ma in realtà Mongo introduce una nuova terminologia.

Una nuova terminologia

Il database continuiamo a chiamarlo database, le tabelle invece vengono ribattezzate collections, le righe delle tabelle vengono chiamate documenti o oggetti, in base alle vostre tendenze, gli index ovvero gli Indici di ricerca rimangono uguali, ci consentono di recuperare più velocemente i dati di una collection evitando la lettura dell’intero contenuto, mentre le joins come abbiamo visto non ci sono ma abbiamo comunque le pre-joins o embedded documents ed infine le chiavi esterne su Mongo non esistono nel senso che non non c’è un meccanismo per gestirle ma nulla ci vieta di usare dei riferimenti.


Quindi usando una terminologia più adatta a Mongo, il database non è altro che un insieme di collezioni di documenti.

Adesso vediamo una panoramica di un’applicazione per dare un’idea generale di come usare MongoDB.

MongoDB in un applicazione

Abbiamo la nostra applicazione, che sarà scritta nel linguaggio che più preferiamo (node, scala, php, quello che volete…) e ovviamente non possono mancare gli utenti, che possono contattarla in qualsiasi modo (da desktop, api, applicazioni mobile e quant’altro).


Se la nostra applicazione sarà un minimo utile avrà sicuramente l’esigenza di avere un database per poter salvare i dati in maniera permanente, ed è qui che entra in scena Mongo. È dotato di una shell amministrativa in cui possiamo eseguire delle query da riga di comando ma ora come ora è separato dall’applicazione e questo non ci permette di farli comunicare, per fare questo ci servono i drivers.


Quindi installiamo i drivers appositi del linguaggio che stiamo utilizzando per poter lanciare interrogazioni al database direttamente dalla nostra applicazione.

Abbiamo detto che MongoDB utilizza la codifica JSON, però lo fa solo quando parla con noi essere umani: cioè quando deve mostrare qualcosa a video. Internamente, invece, salva tutti i dati in forma binaria, per questioni di storage e performance, convertendoli in BSON ovvero Binary JSON, è un procedimento che fa in automatico quindi non spaventatevi, per noi non cambia nulla.

Il BSON lo usa solo tra server (come ad esempio tra il database e l’app) mentre il JSON diciamo è per l’umano (come nella shell).


Quando lanciamo una query tramite i drivers il risultato che ci restituisce è in formato BSON e viene allocato direttamente in RAM, quando poi viene passato al driver in attesa di risposta non viene convertito in JSON ma bensì nella struttura dati nativa del linguaggio che state utilizzando, se usate node.js o PHP sarà un array mentre se usate python sarà un oggetto, ogni linguaggio ha il suo tipo di dato.


Questo schemino era giusto per darvi un idea di come interagisca Mongo all’interno di un’applicazione. Abbiamo detto che i modi per interrogare Mongo sono due: la shell amministrativa e i drivers; vediamoli molto brevemente.

Riga di comando e Drivers

La shell è esattamente quello che ci aspettiamo, ovvero una console a riga di comando, al suo interno abbiamo un interprete javascript che ci permette di interrogare direttamente il database. È utilissima per effettuare test e attività amministrative.

Quando invece è la nostra applicazione a voler comunicare con il database allora dobbiamo usare i drivers; vanno installati e sono pronti all’uso, ormai sono presenti i drivers per tutti i linguaggi più popolari e sicuramente anche per il vostro preferito.


Noi ovviamente in queste lezioni approfondiremo solamente la shell, non useremo mai nessun linguaggio e di conseguenza non vedremo nessun driver.

È pur sempre un corso base quindi è meglio non andare troppo oltre con gli argomenti altrimenti non mi basterebbe il tempo per girare tutti i video!