• Save
MongoDB
Upcoming SlideShare
Loading in...5
×
 

MongoDB

on

  • 1,525 views

 

Statistics

Views

Total Views
1,525
Views on SlideShare
1,525
Embed Views
0

Actions

Likes
1
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

CC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike LicenseCC Attribution-NonCommercial-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

MongoDB MongoDB Presentation Transcript

  • MongoDBPrimi 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 NoSQLdatabase”
  • 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 allavostra 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 #2use()Ci permette di cambiare database. Non imposta se ci spostiamo su un db che non esiste alla creazione della primacollezione 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 danoi ed in più system.index (collezione degli indici!)find()dbname.collezione.find()remove()dbname.collezione.remove({where_opzionale})
  • I SelettoriUn 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:252. $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() #2UpsertÈ 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 multipliMongoDB per default aggiorna un solo documento alla volta (infatti questo parametro è impostato didefault a FALSE).
  • Find()SINTASSI: find({where},[{attributi_estratti}])Per selezionare gli attributi che devono ritornare come risultato bisogna mettere nome_attr: 1Di default verrà anche restituito _id del documento.OrdinamentiCi 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 nonavere perdite di performance considerevoli..sort({attributi})
  • Find() #2PaginazioneCi sono dei metodi che si possono concatenare a find per ordinamento, paginazione, conteggi….limit(n_record_da_visualizzare).skip(record_da_saltare)ConteggiCi sono dei metodi che si possono concatenare a find per ordinamento, paginazione, conteggi….count()
  • Modellazione dei datiNiente JoinMongoDB non prevede Join, anche se i dati possono essere relazionali. MongoDB ci offre degli approcci persopperire alle join senza effettuare tutto via codice.ArrayViene creato un campo nel documento che conterrà gli ID di tutti i documenti collegati (relazionati)Documenti incorporatiViene creato un campo dove verranno inseriti interi documenti collegati. DBRef è una convenzione utilizzataper collegare doc diversi situati in collezioni diverse.Per ricercare un campo di un documento basta utilizzare questa notazione:campoDocPrincipale.campoDocIncorporatoDenormalizzazioneOvvero duplicare i dati in ogni documento.
  • Modellazione dei dati #2Quale scegliere?Gli array contenenti gli ID sono sempre una scelta utile con scenari 1:N o N:M; DBRef non sono usati difrequente, 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 idocumenti incorporati sono usati solo per inserire documenti di piccole dimensioni e che si vogliono semprerecuperare con il documento principale.
  • Come e Quante collezioni usare?Dato che le collezioni sono schema-less è possibile concepire un sistema con una solacollezione.Io consiglio di mantenere la struttura più simile ad un DB relazionale, ovvero per ogni tabellafare 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 stragrandemaggioranza dei dati che si modelleranno saranno ben strutturatiE’ utile questo dinamismo se si devo introdurre delle novità (in un DB relazionale si metteva unacolonna nullabile!)Molto importante è dal punto di vista delle serializzazione, non c’è bisogno di mattare leproprietà ecc, ma solo serializzare i JSON (o meglio in BSON)
  • Quando utilizzare MongoDB? #2ScrittureMolto utile per il logging, questo perché la scrittura in MongoDB è abbastanza veloce per 2fattori:1. Possiamo dare un comando di scrittura e vederlo ritornare senza che la scrittura sia fisicamente avvenuta2. 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 nonutilizzare un campo per la data di creazione essendo già inseriti in modo progressivo.
  • Quando utilizzare MongoDB? #3AffidabilitàSi deve utilizzare il journaling, basta aggiungere al file mongodb.conf questa rigajournal = trueRiavviamo il server per rendere la modifica effettivaRicerca full-textNon è ancora prevista in MongoDB (almeno nella versione 1.8) però grazie al supporto degli arraypossiamo implementare una ricerca full-text base.TransazioniNon sono supportate in MongoDB
  • Quando utilizzare MongoDB? #3Elaborazione datiCi si affida a MapReduce per la gran parte dei lavori di elaborazione, utilizza MapReduce basato su JSe 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 datimolto potenti!Strumenti e MaturitàMancanza la supporto dei numeri in virgola mobile in base 10.Driver per molti linguaggi, protocollo semplice e moderno.
  • MapReduceE’ un approccio all’elaborazione dati che vanta 2 vantaggi:1. Performace in linea teorica MapReduce può operare in parallelo utilizzando thread2. 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-value2. REDUCE: prende la chiave e il valore per elaborarli e produrre un risultato finaleSINTASSI: db.coll.mapReduce(map,reduce,{out:{inline:1}})
  • MapReduce #2 Funzione MAPImportante è 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 #3Funzione REDUCE REDUCE deve essere IDEMPOTENTE!OUTPUT
  • Performance e strumentiIndiciServono 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})ExplainServe per capire se le nostre query stanno usando indici o menoSINTASSI: db.coll.find().explain()
  • Performance e strumenti #2Scritture ‘Fire and forget’Questo metodo di scrittura dati permette migliore performance a discapito di un maggiore rischio diperdita di dati in caso di crash.ShardingÈ un approccio alla scalabilità che ripartisce i dati su server multipli.ReplicaizoneFunziona 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 diconfigurazione in merito.Statistiche ed interfaccia webdb.coll.stats() per avere statistiche sul DB ; http://localhost:28017 per l’interfaccia web!
  • Performance e strumenti #3Backup e RestoreNelal cartella bin c’è l’eseguibile mongodump che server per effettuare i backup dei vari db.mongodump --help: guida sullo scriptmongodump –-db <nome>: permette il backup di uno specifico databasemongorestore –collection <nome> <path_file_backup>: per fare ilrestoreESEMPIO: mongodump –db coll –out backupEffettuo 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