Introduzione ai Database con Mongo DB

Corso completo Web Developer - Parte 3 - 3.2

In questa lezione stiamo andando a scoprire un'altra parte fondamentale del mondo della programmazione: i database!

Fino alla lezione precedente ci siamo focalizzati sul Backend, in questa lezione voglio farti scoprire come funzionano i database e come usarli con un server Node JS.

Andiamo a scoprire il mondo dei database introducendo il concetto di SQL e NoSQL e iniziando ad usare il nostro primo database con Mongo DB! Pronto, partenza, via! 🚀

Introduzione

Assumendo che tu parta da zero e che quindi non sappia neanche a che cosa serve un database voglio partire dal rispondere una domanda fondamentale: a che cosa serve un database?

Esiste un concetto che in inglese viene chiamato "Data Persistence" ovvero la persistenza dei dati.

Finora quando abbiamo lavorato con i dati abbiamo utilizzato delle variabili, delle arrays, dei file JSON in cui abbiamo salvato dei dati e li abbiamo utilizzati come se fossero stati i nostri database ovvero un posto dove salvare i dati.

Ora immaginiamo per un attimo che abbiamo migliaia di dati, ad esempio un blog con centinaia o migliaia di articoli, e che questi dati siano anche dinamici ovvero che possono essere modificati, aggiornati, cancellati. Iniziare a gestire tutto ciò con delle variabili o dei file JSON diventa molto complicato e poco efficiente.

Per ovviare a questo problema in modo ottimale sono stati creati i database ovvero questi software che ci permettono di salvare i nostri dati in modo strutturato e di poterli gestire in modo efficiente.

Pensa ad un database come se fosse un registro anche come quello dell'anagrafe dove vengono salvati i dati di tutti i cittadini di un paese. In questo caso il database è il registro e i dati sono i cittadini che sono stati scritti al suo interno.

Quindi è un sistema digitale per salvare dati.

SQL vs NoSQL

Esistono due tipi di database: SQL e NoSQL.

L'acronimo SQL sta per Structured Query Language ed è un vero e proprio linguaggio che ci permette di interagire con i database di tipo SQL.

Alcuni esempi di database di tipo SQL sono:

  • MySQL
  • PostgreSQL
  • SQLite

L'acronimo NoSQL sta per Not Only SQL ed è un tipo di database che non utilizza il linguaggio SQL per interagire con i dati.

Alcuni esempi di database di tipo NoSQL sono:

  • MongoDB
  • Redis
  • CouchDB
  • Cassandra

In questa lezione andremo ad utilizzare Mongo DB che è un database di tipo NoSQL.

I database di tipo SQL sono suddivisi in tabelle dove ogni tabella rappresenta una determinata entità nella nostra applicazione Node JS (ad esempio una tabella Articoli come l'entità che abbiamo utilizzato nella precedente lezione) ed ogni riga rappresenta un record ovvero un singolo elemento di quella tabella (ad esempio un singolo articolo). Queste tabelle inoltre possono avere delle relazioni tra di loro.

Facciamo un esempio in cui abbiamo due entità: User e Book. Spesso vi è una convenzione che prevede che il nome della tabella sia il nome al plurale dell'entità a cui si riferisce quindi avremo due tabelle users e books.

Potremmo ad esempio creare un'associazione tra queste due entità in modo tale che un utente può avere più libri e un libro appartiene ad un singolo utente. In questo caso avremo una relazione 1 a molti tra User e Book, ovvero un utente può avere molti libri ma un libro appartiene ad un solo utente.

users
idfirst_namelast_nameemail
1JohnSmithjohn.smith@example.com
2JaneDoejane.doe@example.com
3MichaelBrownmichael.brown@example.com
books
idtitleauthoruser_id
1The Catcher in the RyeJ.D. Salinger1
2To Kill a MockingbirdHarper Lee1
3Pride and PrejudiceJane Austen2
41984George Orwell3
5Brave New WorldAldous Huxley3

Nota che la tabella books ha una colonna user_id che rappresenta l'associazione tra le due tabelle. In questa colonna troveremo l'id dell'utente a cui appartiene il libro.

I database di tipo NoSQL sono arrivati in seguito infatti sono un concetto più recente rispetto ai classici database SQL.

La differenza principale tra i due tipi di database è che i database SQL sono strutturati mentre i database NoSQL sono non strutturati.

Installazione di Mongo DB

Siccome l'installazione di Mongo DB cambia a seconda del sistema operativo che si sta utilizzando, suddivideremo questa lezione in due parti: una per gli utenti Windows e una per gli utenti Mac.

Installazione di Mongo DB su Windows

L'installazione di Mongo DB su Windows richiede svariati passaggi e in alcuni di questi potresti facilmente perderti ma non preoccuparti, ti guiderò passo passo. L'unica cosa che ti chiedo è di mantenere alta l'attenzione e di seguire tutti i passaggi 🙂

Ti anticipo che saranno due cose che dovremmo scaricare: MongoDB e MongoDB Shell. Iniziamo con MongoDB.

1. Scarica Mongo DB

Per scaricare Mongo DB apri il seguente link: https://www.mongodb.com/try/download/community

Fai attenzione a scaricare la versione Community Server e non la versione Atlas.

Inoltre assicurati di scaricare il Package di tipo MSI. Al momento in cui scrivo questo articolo la versione di Mongo DB è la 6.0.5. Non preoccuparti se la tua versione è diversa, l'importante è che sia la versione Community Server e che sia un Package di tipo MSI.

2. Installazione Mongo DB

2.1 Una volta scaricato il file, aprilo e segui la procedura per l'installazione seguendo i seguenti screenshots.

2.3 Seleziona l'installazione di tipo Custom

2.4 Seleziona la cartella di destinazione cliccando su Browse

2.5 Inserisci come cartella di destinazione C:\mongodb

2.6 Deseleziona la voce Install MongoD as a Service

2.7 Deseleziona la voce Install MongoDB Compass

2.8 Clicca su Next e poi su Install per iniziare l'installazione

2.9 Acconsenti all'installazione di Mongo DB

2.10 Clicca su Finish per completare l'installazione

3. Configurazione Mongo DB - creaazione delle cartelle per i dati

3.1 Esegui la Windows PowerShell come Amministratore

3.2 Scrivi il seguente comando per creare la cartella data all'interno della cartella C:\mongodb

mkdir C:\data

3.3 Scrivi il seguente comando per creare la cartella db all'interno della cartella C:\data

mkdir C:\data\db

4. Configurazione Mongo DB - aggiunta di Mongo DB alla variabile di ambiente PATH di Windows

4.1 Clicca con il pulsante destro del mouse sulla voce Questo PC e poi clicca su Proprietà

4.2 Cerca la voce Visualizza impostazioni di sistema avanzate e clicca su Visualizza impostazioni di sistema avanzate

4.3 Clicca su Variabili d'ambiente

4.4 Nel riguadro sottostante "Variabili di sistema" seleziona la voce Path e clicca su Modifica

4.5 Clicca su Nuovo

4.6 Scrivi il seguente percorso C:\mongodb\bin dopodichè premi invio. Non chiudere questa finestra delle variabili d'ambiente perchè ci servirà per aggiungere il percorso di Mongo Shell nei prossimi steps.

5. Installazione di Mongo Shell

5.1 Scarica Mongo Shell da questo link: https://www.mongodb.com/try/download/shell

5.2 Conferma che il file sia sicuro cliccando su "Nascondi dettagli" per mostrare il pulsante "Conserva comunque" e clicchiamo quindi su "Conserva comunque"

5.3 Eseguiamo la Windows PowerShell come Amministartore e creiamo una cartella nominata mongosh in C:\

mkdir C:\mongosh

5.4 Estraiamo la cartella del file Zip che abbiamo appena scaricato e spostiamo questa cartella nella cartella mongosh appena creata

5.5 Ora entriamo nella cartella che abbiamo appena spostato in C:\mongosh e copiamo il percorso

5.6 Infine torniamo nel menù delle variabili d'ambiente e aggiungiamo quello che abbiamo appena copiato. Clicca su Nuovo e incolla il percorso che hai copiato.

5.7 Clicca su OK per confermare e chiudi la finestra delle variabili d'ambiente.

6. Eseguiamo Mongo DB e Mongo Shell

6.1 Eseguiamo Windows PowerShell come Amministratore e scriviamo il seguente comando per avviare Mongo DB:

mongod

Una serie di informazioni verranno mostrate a schermo

6.2 Apriamo un'altra finestra di Windows PowerShell come Amministratore e scriviamo il seguente comando per avviare Mongo Shell:

mongosh

6.3 Se l'installazione è andata a buon fine, Mongo Shell si aprirà e vedrai la seguente schermata:

6.4 Possiamo verificare i database che abbiamo di default con il comando show dbs

Ricorda che per Windows dovrai sempre aprire almeno una finestra di Windows PowerShell come Amministratore per avviare Mongo DB con mongod. Se poi necessiti anche della Mongo Shell dovrai aprire un'altra finestra di Windows PowerShell come Amministratore e avviare Mongo Shell con mongosh.

Installazione di Mongo DB su Mac

Questa è la documentazione ufficiale per l'installazione di Mongo DB su Mac: https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/

Per installare Mongo DB su Mac necessiti di avere i cosiddetti "Xcode Command Line Tools" e Homebrew installati sul tuo computer.

Se non hai questi due installati hai due soluzioni: puoi seguire il mio articolo dove ti aiuto a preparare tutto l'ambiente di programmazione oppure puoi seguire gli steps che trovi nella documentazione ufficiale di Mongo DB.

Per sapere se hai già i "Xcode Command Line Tools" installati sul tuo computer, apri il terminale e scrivi il seguente comando:

xcode-select -p

Se il terminale ti restituisce un percorso, significa che hai già i "Xcode Command Line Tools" installati sul tuo computer, se invece il terminale ti restituisce un messaggio di errore, significa che non hai i "Xcode Command Line Tools" installati sul tuo computer.

Questo è l'output quando entrambi sono correttamente installati: (il percorso che ti compare come output potrebbe essere leggermente diverso)

Nel caso non dovessi averli installati, questa è la parte dove spiego come installare i "Xcode Command Line Tools" e Homebrew.

Xcode Command Line Tools

Homebrew

Leggi qui l'articolo: Iniziare a programmare: prepara il tuo computer ad un ambiente di sviluppo

Una volta che ti sei assicurato di avere entrambi installati puoi procedere con i commandi per l'installazione.

Installazione di Mongo DB

  1. Apri il terminale
  2. Copia e incolla il seguente comando e premi invio: (questo comando può richiedere un pò di tempo)
brew tap mongodb/brew
  1. Copia e incolla il seguente comando e premi invio:
brew update
  1. Copia e incolla il seguente comando e premi invio: (questo comando installerà svariate dipendenze necessarie per Mongo DB e potrebbe richiedere un pò di tempo)
brew install mongodb-community@6.0

Quando avrà finito dovresti ottenere un output simile a questo:

  1. Infine puoi eseguire Mongo DB con il seguente comando:
brew services start mongodb-community@6.0
  1. Ora prova ad entrare nella shell di Mongo DB con il seguente comando: (puoi uscire dalla shell con il comando exit)
mongosh

A questo punto Mongo DB è installato sul tuo computer e puoi iniziare ad utilizzarlo! 🎉

La Mongo DB Shell

Come hai visto nella sezione precedente, abbiamo a nostra disposizione una cosa chiamata Mongo DB Shell. Questa shell è praticamente un'interfaccia a riga di comando che ci permette di interagire con Mongo DB e con i dati salvati al suo interno.

Pensa a questa shell come la Node REPL che abbiamo visto in precedenza, ma invece di interagire con Node, interagisce con Mongo DB.

Eseguiamo quindi la shell di Mongo DB con il seguente comando:

mongosh

Se sei in Windows assicurati di avviare Mongo DB con il seguente comando in un'altra finestra di Windows PowerShell

mongod

Se sei su Mac o Linux puoi avviare Mongo DB con il seguente comando. Se è già in esecuzione ti tornerà un messaggio dove dice che puoi fare il restart, in questo caso sei a posto e puoi proseguire.

brew services start mongodb-community@6.0

Quando abbiamo un server in esecuzione che esegue il software di un database, in questo caso Mongo DB, possiamo avere uno o più database. Che cosa significa questo?

Se per esempio avessimo più applicazioni sul nostro computer che abbiamo sviluppato e che utilizzano Mongo DB, potremmo avere un database per ogni applicazione.

Ad esempio potremmo avere un database per un blog che abbiamo sviluppato, uno per un e-commerce e un altro per un'applicazione di gestione di un'azienda ed è importante che si mantengono separati perchè queste tre applicazioni non hanno nulla a che fare l'una con l'altra.

Con l'installazione di Mongo avremo un database che viene creato di default che si chiama test e che possiamo vedere eseguendo il seguente comando nella shell avremo un output test:

db

Possiamo ovviamente creare nuovi database o eliminarli attraverso la Mongo Shell.

Proviamo a vedere tutti i database che abbiamo in questo momento

show dbs

Ora proviamo a crearne uno nuovo. Lo chiamiamo anagrafe e colleghiamoci a questo nuovo database una volta creato.

use anagrafe

Ti basta utilizzare il comando use seguito dal nome del database che vuoi utilizzare e Mongo DB creerà automaticamente il database se non esiste già.

Ora proviamo a vedere se viene visualizzato tra i database che abbiamo

show dbs

Come potrai notare non viene visualizzato. Questo perchè Mongo DB in realtà non salva effettivamente il database fino a quando non viene salvato qualcosa al suo interno.

Per confermare che il database è stato creato possiamo utilizzare il comando db e vedere che ci tornerà come output il nome del database

db

Adesso siamo pronti ad iniziare a salvare dei dati al nostro database! 🎉

Operazione CRUD con Mongo DB

Mongo DB è un database che utilizza un modello di dati chiamato Document Database. Questo significa che i dati vengono salvati in documenti che sono molto simili a degli oggetti JSON.

Nella lezione precedente sulle RESTful APIs con Node JS abbiamo visto come creare delle API con degli endpoint che seguono il concetto di CRUD, l'acronimo che sta per Create, Read, Update e Delete.

Nel momento in cui andremo a collegare il database all'applicazione Node JS vorremmo appunto sfruttare il nostro database per poter eseguire le operazioni CRUD e quindi vorremmo poter creare dei documenti, leggerli, aggiornarli e cancellarli.

Vediamo quindi come possiamo eseguire queste operazioni con Mongo DB.

Mongo Inserts (Create)

Quando inseriamo qualche dato nel nostro database con l'operazione Mongo Insert non andremo semplicemente a salvarlo in modo randomico nel nostro "archivio digitale" ma andremo a salvarlo in una collezione chiamata appunto collection.

Nel caso in cui provassimo ad utilizzare un valore in una collection che ancora non esiste, Mongo DB creerà automaticamente la collection per noi. Ora procediamo con il nostro primo insert! 😃

Nella Mongo Shell possiamo utilizzare il comando insertOne per inserire un documento in una collezione. Il comando insertOne accetta come argomento un oggetto JSON che rappresenta il documento che vogliamo inserire.

show collections
db.persone.insertOne({nome: "Emanuele", cognome: "Gorga", eta: "29", sesso: "M", luogo_di_nascita: "marte"})

Adesso proviamo a controllare se la collection chiamata persone è stata creata e se il documento è stato inserito correttamente.

db.persone.find()

Proviamo a fare attenzione alle seguenti tre cose:

  1. La collection è stata creata
  2. Il documento è stato inserito correttamente
  3. Mongo DB ha aggiunto un campo _id che è unico per ogni documento e che viene utilizzato come identificatore univoco per il documento

Un altro metodo supportato da Mongo DB per inserire dei documenti è insertMany che accetta come argomento un array di oggetti JSON.

Vediamo un esempio:

db.persone.insertMany([{nome: "Mario", cognome: "rossi", eta: "45", sesso: "maschio"}, {nome: "Sara", cognome: "Verdi", eta: "25", sesso: "femmina", luogo_di_nascita: "terra"}])

Mongo Finding / Queries (Read)

Ora che abbiamo visto come inserire dei dati nel nostro database vediamo come possiamo leggerli.

Perchè dovrebbe servirci una query per leggere i dati? Non potremmo semplicemente utilizzare il comando find?

In realtà il comando find è una query. Una query è un comando che viene utilizzato per leggere i dati da un database.

Alla query find possiamo passare come argomento un oggetto JSON che rappresenta i criteri di ricerca che vogliamo utilizzare per trovare i documenti che ci interessano.

E perchè dovrebbe servirci passare dei criteri di ricerca?

Immagina quando vai sulla Homepage di Facebook e vedi tutti i post dei tuoi amici. Facebook sta facendo il find degli ultimi post nel database e poi te li mostra sulla tua bacheca.

Ora immagina di avere un database con 1 milione di documenti. Se volessi trovare un documento in particolare senza utilizzare dei criteri di ricerca, Mongo DB dovrebbe scorrere tutti i documenti per trovare quello che ti interessa. Questo sarebbe un processo molto lento e per niente efficiente.

Vediamo quindi come possiamo utilizzare la query find nel nostro caso per trovare le persone che hanno come luogo di nascita marte.

db.persone.find({luogo_di_nascita: "marte"})

Possiamo vedere che il database ci ritornerà un singolo documento in questo caso perchè nella collection persone abbiamo inserito solo una persona con il luogo di nascita marte.

Questo è come puoi utilizzare la query find per trovare dei documenti nel tuo database.

Mongo Updates (Update)

Ora che abbiamo visto come inserire dei dati e come leggerli vediamo come possiamo aggiornarli.

Per aggiornare dei dati nel nostro database possiamo utilizzare il comando updateOne che accetta come argomento due oggetti JSON.

Il primo oggetto JSON rappresenta i criteri di ricerca che vogliamo utilizzare per trovare il documento che vogliamo aggiornare mentre il secondo rappresenta i nuovi valori che vogliamo aggiornare nel documento.

Facciamo un esempio pratico. Supponiamo di voler aggiornare il documento che abbiamo inserito in precedenza con il nome Emanuele e il cognome Gorga e di voler aggiornare il campo eta con il valore 30.

db.persone.updateOne({nome: "Emanuele", cognome: "Gorga"}, {$set: {eta: "30"}})

Ora verifichiamo se il documento è stato aggiornato correttamente.

db.persone.find({nome: "Emanuele", cognome: "Gorga"})

Con il comando updateOne possiamo aggiornare un solo documento alla volta. Se volessimo aggiornare più documenti possiamo utilizzare il comando updateMany che accetta come argomento due oggetti JSON seguendo la stessa logica di insertMany.

Inoltre con il comando updateOne possiamo anche aggiungere dei nuovi campi al documento che vogliamo aggiornare.

db.persone.updateOne({nome: "Emanuele", cognome: "Gorga"}, {$set: {lavoro: "sviluppatore"}})

Complimenti! Hai appena aggiornato un documento nel tuo database :) !

Mongo Deletes (Delete)

Ora che abbiamo visto come inserire, leggere e aggiornare dei dati vediamo come possiamo cancellarli.

Per cancellare dei dati nel nostro database possiamo utilizzare il comando deleteOne che accetta come argomento un oggetto JSON che rappresenta i criteri di ricerca che vogliamo utilizzare per trovare il documento che vogliamo cancellare.

Proviamo a cancellare il documento che ha come nome Mario

db.persone.deleteOne({nome: "Mario"})

Ora verifichiamo se il documento è stato cancellato correttamente.

db.persone.find({nome: "Mario"})

Potrai notare due cose:

  1. L'output ci ritorna un oggetto { acknowledged: true, deletedCount: 1 } dove possiamo già leggere che deletedCount è uguale a 1 quindi il documento è stato cancellato correttamente.
  2. Quando proviamo a cercare il documento con il comando db.persone.find({nome: "Mario"}) non ci viene ritornato nessun documento perchè è stato cancellato.

Conclusione

Ti voglio fare i miei complimenti per essere arrivato fin qui! Questo articolo è stato molto lungo e pieno di informazioni importanti che aggiunte a quelle delle lezioni precedenti ti permetteranno presto di riuscire a sviluppare un'applicazione FullStack.

Mongo DB è uno dei database NoSQL più popolari ed è relativamente semplice da imparare. Con tanta pratica ed un pò di pazienza vedrai che riuscirai ad entrare nella logica di questo database e a padroneggiarlo con facilità.

Nella prossima lezione andremo a vedere come interagire con il nostro database utilizzando JavaScript. Andremo infatti a vedere Mongoose che è un ODM (Object Data Modeling) e ci permette di interagire con con il database facilmente.

Ti aspetto nella prossima lezione! Ciao! :)