2. Introduzione
MongoDB è un database noSQL tipologia di database in forte
evoluzione in questi anni a discapito dei più solidi RDBMS.
Le soluzione noSQL non vengono progettate come alternative a
modelli più tradizionali, ma intendono far fronte a nuove necessità.
MongoDB è un database orientato principalmente ai documenti
(serializzati in JSON o per meglio dire in BSON [gestione binaria dei
dati]); può essere utilizzato in combinazione con soluzione più
tradizionali (magari come cache o per velocizzare le operazioni di
I/O)
Dal sito web ufficiale
“MongoDB (from "humongous") is a scalable, high-performance, open source NoSQL
database”
3. Peculiarità
Document-Oriented Storage
Full Index Support
Replication & High Availability
Auto-Sharding
Querying
Fast In-Place Updates
Map/Reduce
GridFS
4. Shell & Driver
MongoDB fornisce sia una shell javascript per testare ed
eseguire operazioni sia Driver di comunicazione per molti
linguaggi di programmazione.
Ci sono ormai anche molte librerie o framework per i più
svariati linguaggi per gestire facilmente il database.
5. Installazione
Bisogna scaricare i binari dal sito (mongodb.org)
Dopo aver scompattato l’archivio troverete la cartella bin/ dentro
qui ci saranno i 2 eseguibili (mongod: processo server, mongo:
shell)
Creare un file chiamato mongodb.config in bin/ ed aggiunge
questa riga: dbpath=PERCORSO_SALVATAGGIO_DB (la path scelta
deve esistere!)
Eseguite il comando mongod –config /path_al_mongodb.confg
MongoDB pronto e operativo!
PS: lanciando mongo (senza la d) connetterete subito la shell alla
vostra istanza del database.
6. Com’è strutturato?
Concetti base:
Attraverso si un’istanza di mongoDB si possono avere N
database.
Un DB può avere N collezioni (simili alle tabelle nei RDBMS)
Le collezioni sono composta da N documenti (simili alle
tuple nei RDBMS). Sono schema-less!
Un documento è composto da N campi (simili alle colonne
nei RDBMS)
Gli inidci di mongoDB sono molto simili a quelli dei RDBMS
I cursori sono un punot abbastanza importante. Quando si
fanno query su mongoDB il risultato è un cursore col quale
passiamo manipolare il risultato.
7. Alcuni comandi base #2
use()
Ci permette di cambiare database. Non imposta se ci spostiamo su un db che non esiste alla creazione della prima
collezione creerà anche il db.
insert()
dbname.collezione.insert({attr1:’valore’,attr2:’valore’},[safe:true]);
getCollectionNames()
dbname.getCollectionNames() tornerà i nomi di tutte le collezioni del database ovvero quelle create da
noi ed in più system.index (collezione degli indici!)
find()
dbname.collezione.find()
remove()
dbname.collezione.remove({where_opzionale})
8. I Selettori
Un selettore in MongoDB assomiglia alla clausola where di un comando SQL.
Viene usato per: trovare, contare, aggiornare, rimuovere documenti e collezioni.
Un selettore è un oggetto JSON la cui forma più semplice è { } che rintraccia tutti i documenti.
Aritmetici Logici Il più flessibile è $where che permette di
passare codice JS da eseguire sul server.
$lt < $exists se esiste
$lte <= , AND
$gt > $or OR
$gte >= $where ….
$ne !=
Ci sono molti altri selettori, ma questi sono i
più comuni.
9. Update()
SINTASSI: db.col.update({where},{valori},[upsert],[update_multiple])
Update() funziona in due modi, ed è fondamentalmente diverso dagli update SQL.
1. db.col.update({name:’pippo’},{age:25})
in questo caso sostituirà il documento trovato con uno nuovo che avrà come parametro solo age:25
2. $set db.col.update({name:’pippo’},{$set:{age:25}})
con questo selettore invece si aggiornerà il documento senza sostituirlo, non perdendo gli altri valori.
Oltre a $set ci sono altri selettori per le modifiche (chiamati modificatori)
$inc: aumenta o diminuisce il valore di un campo {$inc: {age: +2}} (aumenta di + 2 l’età)
$push: permette di inserire un nuovo valore in un attributo di tipo array
10. Update() #2
Upsert
È un parametro opzionate di update() messo a FALSE di default.
Se è impostato a true, si cerca il documento se lo si trova si aggiorna altrimenti lo si crea.
Aggiornamenti multipli
MongoDB per default aggiorna un solo documento alla volta (infatti questo parametro è impostato di
default a FALSE).
11. Find()
SINTASSI: find({where},[{attributi_estratti}])
Per selezionare gli attributi che devono ritornare come risultato bisogna mettere nome_attr: 1
Di default verrà anche restituito _id del documento.
Ordinamenti
Ci sono dei metodi che si possono concatenare a find per ordinamento, paginazione, conteggi…
E’ da notare che se l’ordinamento viene fatto su un attributo non indicizzato allora sarà limitato, per non
avere perdite di performance considerevoli.
.sort({attributi})
12. Find() #2
Paginazione
Ci sono dei metodi che si possono concatenare a find per ordinamento, paginazione, conteggi…
.limit(n_record_da_visualizzare)
.skip(record_da_saltare)
Conteggi
Ci sono dei metodi che si possono concatenare a find per ordinamento, paginazione, conteggi…
.count()
13. Modellazione dei dati
Niente Join
MongoDB non prevede Join, anche se i dati possono essere relazionali. MongoDB ci offre degli approcci per
sopperire alle join senza effettuare tutto via codice.
Array
Viene creato un campo nel documento che conterrà gli ID di tutti i documenti collegati (relazionati)
Documenti incorporati
Viene creato un campo dove verranno inseriti interi documenti collegati. DBRef è una convenzione utilizzata
per collegare doc diversi situati in collezioni diverse.
Per ricercare un campo di un documento basta utilizzare questa notazione:
campoDocPrincipale.campoDocIncorporato
Denormalizzazione
Ovvero duplicare i dati in ogni documento.
14. Modellazione dei dati #2
Quale scegliere?
Gli array contenenti gli ID sono sempre una scelta utile con scenari 1:N o N:M; DBRef non sono usati di
frequente, ma sono sempre utilizzabili.
E’ da tenere in considerazione che un singolo documento ha un limite di 16MB.
Da statistiche si nota che i programmatori MongoDB utilizzano molto i riferimenti diretti, mentre i
documenti incorporati sono usati solo per inserire documenti di piccole dimensioni e che si vogliono sempre
recuperare con il documento principale.
15. Come e Quante collezioni usare?
Dato che le collezioni sono schema-less è possibile concepire un sistema con una sola
collezione.
Io consiglio di mantenere la struttura più simile ad un DB relazionale, ovvero per ogni tabella
fare una collezione.
16. Quando utilizzare MongoDB?
MongoDB dovrebbe essere considerato un’alternativa diretta ai DB relazionali.
MongoDB come già detto è schema-less, ma in ogni caso molto spesso al stragrande
maggioranza dei dati che si modelleranno saranno ben strutturati
E’ utile questo dinamismo se si devo introdurre delle novità (in un DB relazionale si metteva una
colonna nullabile!)
Molto importante è dal punto di vista delle serializzazione, non c’è bisogno di mattare le
proprietà ecc, ma solo serializzare i JSON (o meglio in BSON)
17. Quando utilizzare MongoDB? #2
Scritture
Molto utile per il logging, questo perché la scrittura in MongoDB è abbastanza veloce per 2
fattori:
1. Possiamo dare un comando di scrittura e vederlo ritornare senza che la scrittura sia
fisicamente avvenuta
2. Introduzione del journaling possiamo controllare il comportamento delle write per quanto
riguarda la durabilità dei dati. (confg. Per ogni write!)
db.getLastError() ci permette di capire se la nostra write è andata a buon fine!
Le collezioni possono essere limitate in grandezza, questo permette di ad esempio non
utilizzare un campo per la data di creazione essendo già inseriti in modo progressivo.
18. Quando utilizzare MongoDB? #3
Affidabilità
Si deve utilizzare il journaling, basta aggiungere al file mongodb.conf questa riga
journal = true
Riavviamo il server per rendere la modifica effettiva
Ricerca full-text
Non è ancora prevista in MongoDB (almeno nella versione 1.8) però grazie al supporto degli array
possiamo implementare una ricerca full-text base.
Transazioni
Non sono supportate in MongoDB
19. Quando utilizzare MongoDB? #3
Elaborazione dati
Ci si affida a MapReduce per la gran parte dei lavori di elaborazione, utilizza MapReduce basato su JS
e quindi alcuni vantaggi (come i task in parallelo) vengono a mancare.
Geospazialità
Supporta indici geospaziali con alcuni selettori ($near, $within) si pososno fare query sui dati
molto potenti!
Strumenti e Maturità
Mancanza la supporto dei numeri in virgola mobile in base 10.
Driver per molti linguaggi, protocollo semplice e moderno.
20. MapReduce
E’ un approccio all’elaborazione dati che vanta 2 vantaggi:
1. Performace
in linea teorica MapReduce può operare in parallelo utilizzando thread
2. Codice molto più ricco
rispetto d SQL qui l’elaborazione dati è molto più flessibile e dinamica.
MapReduce è un processo in due fasi:
1. MAP: trasforma i documenti del flusso in un array key-value
2. REDUCE: prende la chiave e il valore per elaborarli e produrre un risultato finale
SINTASSI: db.coll.mapReduce(map,reduce,{out:{inline:1}})
21. MapReduce #2
Funzione MAP
Importante è la funzione emit() che ci permette di unire dei dati raggruppandoli per chiave.
Se ci sono più valori con la stessa chiave allora creerà un array con tutti i valori restituiti.
OUTPUT
23. Performance e strumenti
Indici
Servono per garantire performance nelle ricerche e negli aggiornamenti.
Creazione indice: db.coll.ensureIndex({name:1})
Cancellazione indice: db.coll.dropIndex({name:1})
Indice univoco: db.coll.ensureIndex({name:1},{unique:true})
Explain
Serve per capire se le nostre query stanno usando indici o meno
SINTASSI: db.coll.find().explain()
24. Performance e strumenti #2
Scritture ‘Fire and forget’
Questo metodo di scrittura dati permette migliore performance a discapito di un maggiore rischio di
perdita di dati in caso di crash.
Sharding
È un approccio alla scalabilità che ripartisce i dati su server multipli.
Replicaizone
Funziona in modo simile a quella dei DB relazionali. Le scritture vengono inviate a un singolo server
(master) che in seguito di sincronizzerà con 1 o + server (slave). Ci osno poi vari parametri di
configurazione in merito.
Statistiche ed interfaccia web
db.coll.stats() per avere statistiche sul DB ; http://localhost:28017 per l’interfaccia web!
25. Performance e strumenti #3
Backup e Restore
Nelal cartella bin c’è l’eseguibile mongodump che server per effettuare i backup dei vari db.
mongodump --help: guida sullo script
mongodump –-db <nome>: permette il backup di uno specifico database
mongorestore –collection <nome> <path_file_backup>: per fare il
restore
ESEMPIO: mongodump –db coll –out backup
Effettuo il bk della collezione coll nella cartella backup/
26. Riferimenti
Little book of MongoDB (http://openmymind.net/2011/3/28/The-Little-MongoDB-Book/)
Tutorial e articoli specializzati
www.mongodb.org