SlideShare una empresa de Scribd logo
1 de 27

MongoDB
Primi passi con questo nuovo Motore di database e le nuove tecnologie!
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”
Peculiarità

   Document-Oriented Storage
   Full Index Support
   Replication & High Availability
   Auto-Sharding
   Querying
   Fast In-Place Updates
   Map/Reduce
   GridFS
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.
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.
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.
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})
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.
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
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).
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})
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()
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.
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.
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.
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)
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.
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
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.
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}})
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
MapReduce #3
Funzione REDUCE
                  REDUCE deve essere IDEMPOTENTE!




OUTPUT
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()
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!
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/
Riferimenti

 Little book of MongoDB (http://openmymind.net/2011/3/28/The-Little-MongoDB-Book/)

 Tutorial e articoli specializzati

 www.mongodb.org
About …

Saverio M.
Analista programmatore

 Twitter: @savez

Más contenido relacionado

La actualidad más candente

20140311 app dev series - 01 - introduction - italian
20140311   app dev series - 01 - introduction - italian20140311   app dev series - 01 - introduction - italian
20140311 app dev series - 01 - introduction - italian
MongoDB
 

La actualidad más candente (7)

Schema design - Corso base di MongoDB
Schema design - Corso base di MongoDBSchema design - Corso base di MongoDB
Schema design - Corso base di MongoDB
 
20140311 app dev series - 01 - introduction - italian
20140311   app dev series - 01 - introduction - italian20140311   app dev series - 01 - introduction - italian
20140311 app dev series - 01 - introduction - italian
 
Deploy MongoDB su Infrastruttura Amazon Web Services
Deploy MongoDB su Infrastruttura Amazon Web ServicesDeploy MongoDB su Infrastruttura Amazon Web Services
Deploy MongoDB su Infrastruttura Amazon Web Services
 
MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009
 
HTML5 e Css3 - 1 | WebMaster & WebDesigner
HTML5 e Css3 - 1 | WebMaster & WebDesigner HTML5 e Css3 - 1 | WebMaster & WebDesigner
HTML5 e Css3 - 1 | WebMaster & WebDesigner
 
MongoDb and Scala SpringFramework Meeting
MongoDb and Scala SpringFramework MeetingMongoDb and Scala SpringFramework Meeting
MongoDb and Scala SpringFramework Meeting
 
MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009MongoDB Scala Roma SpringFramework Meeting2009
MongoDB Scala Roma SpringFramework Meeting2009
 

Destacado

Destacado (6)

MongoDB Schema Design
MongoDB Schema DesignMongoDB Schema Design
MongoDB Schema Design
 
Database
DatabaseDatabase
Database
 
Database introduzione
Database introduzioneDatabase introduzione
Database introduzione
 
Introduzione al SQL e ai database
Introduzione al SQL e ai databaseIntroduzione al SQL e ai database
Introduzione al SQL e ai database
 
MongoDB 3.4 webinar
MongoDB 3.4 webinarMongoDB 3.4 webinar
MongoDB 3.4 webinar
 
MongoDB Schema Design: Four Real-World Examples
MongoDB Schema Design: Four Real-World ExamplesMongoDB Schema Design: Four Real-World Examples
MongoDB Schema Design: Four Real-World Examples
 

Similar a MongoDB

Py a6 python-database
Py a6 python-databasePy a6 python-database
Py a6 python-database
Majong DevJfu
 

Similar a MongoDB (20)

MongoDB
MongoDBMongoDB
MongoDB
 
Excel development e sql 2.1
Excel development e sql   2.1Excel development e sql   2.1
Excel development e sql 2.1
 
couchbase mobile
couchbase mobilecouchbase mobile
couchbase mobile
 
Office & VBA - Giorno 6
Office & VBA - Giorno 6Office & VBA - Giorno 6
Office & VBA - Giorno 6
 
Py a6 python-database
Py a6 python-databasePy a6 python-database
Py a6 python-database
 
Introduzione a google_app_engine_datastore
Introduzione a google_app_engine_datastoreIntroduzione a google_app_engine_datastore
Introduzione a google_app_engine_datastore
 
Linuxday2013
Linuxday2013 Linuxday2013
Linuxday2013
 
Oltre il modello relazionale
Oltre il modello relazionaleOltre il modello relazionale
Oltre il modello relazionale
 
Back to Basics webinar 1 IT 17 - Introduzione ai NoSQL
Back to Basics webinar 1 IT 17 - Introduzione ai NoSQLBack to Basics webinar 1 IT 17 - Introduzione ai NoSQL
Back to Basics webinar 1 IT 17 - Introduzione ai NoSQL
 
MongoDB - Back to Basics 2017 - Introduzione a NoSQL
MongoDB - Back to Basics 2017 - Introduzione a NoSQLMongoDB - Back to Basics 2017 - Introduzione a NoSQL
MongoDB - Back to Basics 2017 - Introduzione a NoSQL
 
Introduzione mongodb
Introduzione mongodbIntroduzione mongodb
Introduzione mongodb
 
Programming iOS lezione 3
Programming iOS lezione 3Programming iOS lezione 3
Programming iOS lezione 3
 
HTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore Romeo
HTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore RomeoHTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore Romeo
HTML5 Italy: Mai più CSS, fogli di stile moderni con LESS - Salvatore Romeo
 
Office & VBA - Giorno 7
Office & VBA - Giorno 7Office & VBA - Giorno 7
Office & VBA - Giorno 7
 
Hadoop in action!
Hadoop in action!Hadoop in action!
Hadoop in action!
 
Scala e i database
Scala e i databaseScala e i database
Scala e i database
 
Big Data Analytics, Giovanni Delussu e Marco Enrico Piras
 Big Data Analytics, Giovanni Delussu e Marco Enrico Piras  Big Data Analytics, Giovanni Delussu e Marco Enrico Piras
Big Data Analytics, Giovanni Delussu e Marco Enrico Piras
 
Database Project in Visual Studio 2010
Database Project in Visual Studio 2010Database Project in Visual Studio 2010
Database Project in Visual Studio 2010
 
Ado net (versione 1 e 2)
Ado net (versione 1 e 2)Ado net (versione 1 e 2)
Ado net (versione 1 e 2)
 
Hadoop SAR
Hadoop SARHadoop SAR
Hadoop SAR
 

Más de Saverio Menin (10)

Server linux samba in un dominio
Server linux samba in un dominioServer linux samba in un dominio
Server linux samba in un dominio
 
Configurare Samba workgroup
Configurare Samba workgroupConfigurare Samba workgroup
Configurare Samba workgroup
 
SEO MIni Guida
SEO MIni GuidaSEO MIni Guida
SEO MIni Guida
 
Introduzione a Less
Introduzione a LessIntroduzione a Less
Introduzione a Less
 
Progetto Afferma
Progetto AffermaProgetto Afferma
Progetto Afferma
 
Html5 based
Html5 basedHtml5 based
Html5 based
 
Seo con drupal
Seo con drupalSeo con drupal
Seo con drupal
 
Hibernate Reference
Hibernate ReferenceHibernate Reference
Hibernate Reference
 
Replicazione Dati su MySQL
Replicazione Dati su MySQLReplicazione Dati su MySQL
Replicazione Dati su MySQL
 
Power Point - Tesi Triennale
Power Point - Tesi TriennalePower Point - Tesi Triennale
Power Point - Tesi Triennale
 

Último

Adducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptxAdducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
sasaselvatico
 
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptxNicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
lorenzodemidio01
 
case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....
giorgiadeascaniis59
 
Presentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informaticaPresentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informatica
nico07fusco
 
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptxScienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
lorenzodemidio01
 

Último (17)

TeccarelliLorenzo-Mitodella.cavernaa.pdf
TeccarelliLorenzo-Mitodella.cavernaa.pdfTeccarelliLorenzo-Mitodella.cavernaa.pdf
TeccarelliLorenzo-Mitodella.cavernaa.pdf
 
Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................Oppressi_oppressori.pptx................
Oppressi_oppressori.pptx................
 
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
Esame di Stato 2024 - Materiale conferenza online 09 aprile 2024
 
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptxProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
ProgettoDiEducazioneCivicaDefinitivo_Christian Tosone.pptx
 
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptxAdducchio.Samuel-Steve_Jobs.ppppppppppptx
Adducchio.Samuel-Steve_Jobs.ppppppppppptx
 
Tosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptxTosone Christian_Steve Jobsaaaaaaaa.pptx
Tosone Christian_Steve Jobsaaaaaaaa.pptx
 
Una breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opereUna breve introduzione ad Elsa Morante, vita e opere
Una breve introduzione ad Elsa Morante, vita e opere
 
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptxNicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
Nicola pisano aaaaaaaaaaaaaaaaaa(1).pptx
 
case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....case passive_GiorgiaDeAscaniis.pptx.....
case passive_GiorgiaDeAscaniis.pptx.....
 
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
CHIẾN THẮNG KÌ THI TUYỂN SINH VÀO LỚP 10 THPT MÔN NGỮ VĂN - PHAN THẾ HOÀI (36...
 
Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.Vuoi girare il mondo? educazione civica.
Vuoi girare il mondo? educazione civica.
 
Presentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informaticaPresentazione tre geni della tecnologia informatica
Presentazione tre geni della tecnologia informatica
 
Storia-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptxStoria-CarloMagno-TeccarelliLorenzo.pptx
Storia-CarloMagno-TeccarelliLorenzo.pptx
 
TeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docxTeccarelliLorenzo-i4stilidellapitturaromana.docx
TeccarelliLorenzo-i4stilidellapitturaromana.docx
 
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptxTeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
TeccarelliLorenzo-PrimadiSteveJobselasuaconcorrenza.pptx
 
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptxScienza Potere Puntoaaaaaaaaaaaaaaa.pptx
Scienza Potere Puntoaaaaaaaaaaaaaaa.pptx
 
LE ALGHE.pptx ..........................
LE ALGHE.pptx ..........................LE ALGHE.pptx ..........................
LE ALGHE.pptx ..........................
 

MongoDB

  • 1.  MongoDB Primi passi con questo nuovo Motore di database e le nuove tecnologie!
  • 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
  • 22. MapReduce #3 Funzione REDUCE REDUCE deve essere IDEMPOTENTE! 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
  • 27. About … Saverio M. Analista programmatore  Twitter: @savez