Corso di Basi di Dati Introduzione a Mongo
Corso di Basi di Dati Introduzione a Mongo. DB Home page del corso: http: //www. cs. unibo. it/~difelice/dbsi/
Introduzione ai database No. SQL Il termine No. SQL identifica una moltitudine di DBMS, basati su modelli logici differenti: ² Database chiave/valore ² Database document-oriented ² Database column-oriented ² Database graph-oriented
Introduzione ai database No. SQL ² Esempi: Mongo. DB, Couch. DB ² Gestione di dati eterogeneei e complessi (semistrutturati) ² Scalabili orizzontalmente, supporto per partizionamento (sharding) dei dati in sistemi distribuiti ² Documenti coppie chiave/valore (JSON) ² Forniscono funzionalità per aggregazione/analisi dei dati (Map. Reduce)
Introduzione ai database No. SQL ² Mongo. DB (https: //www. mongodb. org) ² Top DBMS non relazionale, open source dal 2009 ² Customer: https: //www. mongodb. com/who-uses-mongodb Source: http: //www. datasciencecentral. com/ Source: https: //blogs. the 451 group. com/
Introduzione ai database No. SQL ² Mongo. DB (https: //www. mongodb. org) ² Database organizzato in collezioni; le collezioni contengono liste di documenti. Ogni documento è un insieme di campi. Mongo. DB Modello Relazionale Collezione Documento Campo Tabella Riga Colonna di una riga
Introduzione ai database No. SQL ² Mongo. DB (https: //www. mongodb. org) ² Inserimento comandi Java. Script tramite shell o driver immersi in linguaggio ospite (Java). ² Utilizzo linguaggio JSON come input/output delle query di aggiornamento o selezione. ² Utilizzo linguaggio BSON (codifica binaria di JSON) per rappresentare i documenti internamente.
Introduzione ai database No. SQL ² Avvio del server e della shell mongod mongo //demone in ascolto sulla porta //shell client ² Utilizzo/Creazione di un DB use prova. DB ² Creazione di una collezione (vuota) db. create. Collection(“circoli”);
Introduzione ai database No. SQL ² Comandi della shell di Mongo. DB Comando Azione show dbs Mostra DB disponibili show collections Mostra le collezioni del db show users Mostra gli utenti del sistema show rules Mostra il sistema di accessi show logs Mostra i log disponibili
Introduzione ai database No. SQL JSON ² Formato per lo scambio di dati tra applicazioni. ² Documenti JSON facilmente interpretabili da macchine; molti parser disponibili. ² I dati di un documento sono racchiusi tra {}. ² I dati assumono la forma nome: valore { nome: “mario” } { nome: “mario”, cognome: “rossi}
Introduzione ai database No. SQL ² Valore Numero, intero o reale { nome: “mario”, eta: 15, punti: 13. 45} ² Valore Stringa, tra apici { nome: “mario”, cognome: “rossi”} ² Valore Booleano, true o false { nome: “mario”, impiegato: true} ² Valore Array, tra parentesi quadre { nome: “mario”, cap: [“ 134”, ” 042”]} ² Valore Oggetto, tra parentesi graffe { nome: “mario”, indirizzo: {citta: bologna, via: po, numero: 3} }
Introduzione ai database No. SQL { nome: “Mario”, Esempio cognome: “Rossi”, eta: 45, impiegato: false, salario: 1205. 50, telefono: [“ 0243434”, “ 064334343”], ufficio: [ {nome: “A”, via: Zamboni, numero: 7}, {nome: “B”, via: Irnerio, numero: 49}] }
Introduzione ai database No. SQL ² Documento in Mongo. DB oggetto JSON! {campo 1: valore 1, campo 2: valore 2, campo 3: [valore 1, …, valore. N]} {name: ‘Marco’, cognome: ‘Rossi’, eta: 22, data: new Date(1997, 6, 2, 12, 30)} {name: ‘Marco’, cognome: ‘Rossi’, eta: 22, domicilio: [‘Roma’, ‘Bologna’]}
Introduzione ai database No. SQL ² Nella stessa collezione, è possibile inserire documenti con strutture campo/valore differenti. COLLEZIONE ANAGRAFICA DOC 1 Marco 22 DOC 2 Massimo Rossi DOC 3 Maria Bianchi 24 1/5/1990 ² Non è possibile rappresentare strutture simili nel modello relazionale, a meno di usare valori NULL!
Introduzione ai database No. SQL ² Inserimento di un documento in una collezione: db. NOMECOLLEZIONE. insert(DOCUMENTO) db. anagrafica. insert({name: ”Marco”, cognome: “Rossi”, eta: 22}) db. anagrafica. insert({cognome: “Rossi”, eta: 22, domicilio: [“Roma”, “Bologna”]}) db. anagrafica. insert({name: “Maria”, eta: 25})
Introduzione ai database No. SQL ² Ogni documento contiene un campo _id, che corrisponde alla chiave primaria della collezione. ² Il campo _id può essere definito esplicitamente, o viene aggiunto in maniera implicita da Mongo. DB. db. anagrafica. insert({_id: 1, name: ‘Marco’, cognome: ‘Rossi’, eta: 22}) ID ESPLICITO db. anagrafica. insert({name: ‘Marco’, cognome: ‘Rossi’, ruolo: ’Manager’}) ID IMPLICITO
Introduzione ai database No. SQL ² Rimozione di documenti da una collezione db. NOMECOLLEZIONE. remove({}) Svuota la collezione, eliminando tutti gli elementi. db. anagrafica. remove({}) DELETE FROM anagrafica db. NOMECOLLEZIONE. remove(SELETTORE) Eliminando dalla collezione tutti i documenti che fanno matching con il selettore !
Introduzione ai database No. SQL ² SELETTORE Documento JSON {campo 1: valore 1, campo 2: valore 2, …} {name: ”Marco”, cognome: ”Rossi”} {$or[{campo 1: valore 1}, {campo 2: valore 2}]} {$or[{name: ”Marco”}, {cognome: ”Rossi”}] $gt, $lt, $gte, $lte, $ne, $in {campo 1: valore 1, campo 2: {$OP: VALORE/I}} {name: ‘Marco’, eta: {$gt: 30}}
Introduzione ai database No. SQL ² Aggiornamento di documento in una collezione: db. NOMECOLLEZIONE. update(SELETTORE, CAMPI) db. NOMECOLLEZIONE. update(SELETTORE, {$SET: CAMPI}) db. NOMECOLLEZIONE. update(SELETTORE, {$PUSH : CAMPI}) db. anagrafica. update({name: ’Mario’}, {eta: 45}) Sostituisce il documento relativo all’impiegato Mario, con la coppia nome/età!
Introduzione ai database No. SQL ² Aggiornamento di documento in una collezione: db. NOMECOLLEZIONE. update(SELETTORE, CAMPI) db. NOMECOLLEZIONE. update(SELETTORE, {$SET: CAMPI}) db. NOMECOLLEZIONE. update(SELETTORE, {$PUSH : CAMPI}) db. anagrafica. update({name: ’Mario’}, {$set : {eta: 45}}) Nel documento relativo all’impiegato Mario, setta l’età pari a 45.
Introduzione ai database No. SQL ² Aggiornamento di documento in una collezione: db. NOMECOLLEZIONE. update(SELETTORE, CAMPI) db. NOMECOLLEZIONE. update(SELETTORE, {$SET: CAMPI}) db. NOMECOLLEZIONE. update(SELETTORE, {$PUSH : CAMPI}) db. anagrafica. update({name: ’Mario’}, {$pus h: {eta: 45}}) Nel documento relativo all’impiegato Mario, aggiunge il campo età.
Introduzione ai database No. SQL ² Il costrutto di find consente di definire delle operazioni di ricerca (query) su una collezione. ² db. nome. Collezione. find() restituisce tutti i documenti presenti nella collezione. ² db. nome. Collezione. find(SELETTORE) restituisce tutti i documenti, i cui campi rispettino la condizione espressa nella query. ² db. nome. Collezione. find(SELETTORE, PROJECTION) restistuisce tutti i campi projection dei documenti, i cui campi rispettino la condizione espressa nella query
Introduzione ai database No. SQL ² Esempi del costrutto di find ² db. anagrafica. find() SELECT * FROM anagrafica AND ² db. anagrafica. find({nome: ’Mario’, eta: 30}) SELECT * FROM anagrafica WHERE ((Nome=‘Mario’) AND (ETA=30)) Campo selezionato ² db. anagrafica. find({nome: ’Mario}, {eta: 1}) SELECT _ID, ETA FROM anagrafica WHERE ((Nome=‘Mario’)
Introduzione ai database No. SQL ² Esempi del costrutto di find db. anagrafica. find({$or: [{nome: ”Mario”}, {eta: 56}]}, {eta: 1}]) SELECT _ID, ETA FROM anagrafica WHERE ((Nome=Mario) OR (ETA=56)) db. anagrafica. find({eta: {$gte: 60}}) SELECT * FROM ANAGRAFICA WHERE (ETA >=60)
Introduzione ai database No. SQL ² Operatori di ordinamento sulla find ² db. nome. Collezione. find(…). sort(CAMPO/CAMPI) 1=Ordinamento crescente, -1=Ordinamento decrescente ² db. anagrafica. find({name: ’Mario’}). sort({eta: 1 }) SELECT * FROM anagrafica WHERE (Name=“Mario”) ORDER BY ETA;
Introduzione ai database No. SQL ² Operatori di conteggio sulla find ² db. nome. Collezione. find(…). count() ² db. anagrafica. find({name: ’Mario’}). count() SELECT COUNT(*) FROM anagrafica WHERE (Name=“Mario”)
Introduzione ai database No. SQL ² Operatori di filtro duplicati sulla find ² db. nome. Collezione. distinct([CAMPO], SELETTORE) ² db. anagrafica. distinct(“eta”, {name: ”Mario”}) SELECT DISTINCT(eta) FROM anagrafica WHERE (Name=“Mario”)
Introduzione ai database No. SQL ² Operatori di aggregazione: funzione aggregate ² Consente di implementare una pipeline di operazioni da eseguire sulla base di dati. ² Ad ogni passo della pipeline, vengono eseguite operazioni che prendono in input dei documenti JSON e producono in output documenti JSON. COLLEZIONE OPERATORE 2 OPERATORE 1 DOC DOC RISULTATO
Introduzione ai database No. SQL ² Operatori della pipeline di aggregazione: ² $geonear ordina i documenti dal più lontano al più vicino rispetto ad una posizione data ² $match seleziona solo alcuni documenti che soddisfano le condizioni fornite in input ² $project seleziona i campi prescelti ² $group raggruppa in base ad uno o più campi ² $limit seleziona i primi n documenti del JSON ² $sort ordina il JSON in base ad alcuni campi ² $out scrive l’output su una collezione
Introduzione ai database No. SQL ² Operatori di aggregazione: funzione aggregate ² db. nome. Collezione. aggregate([OPERATORE 1, OPERATORE 2, …, OPERATOREN]) ² db. anagrafica. aggregate([ {$match: ’A’}, {$group: {_id: ”$custom. Id”, total: {$sum: “$amount”}} ])
Introduzione ai database No. SQL ² Operatori di aggregazione: map-and-reduce QUERY phase seleziona solo i documenti che fanno matching con il selettore. MAP phase mappa i documenti selezionati in un insieme di coppie chiave/valore. REDUCE phase condensa i documenti le cui chiavi dispongono di più valori.
Introduzione ai database No. SQL ² Operatori di aggregazione: map-and-reduce
Introduzione ai database No. SQL ² E’ possibile raccogliere i comandi mongo. DB in uno script (linguaggio Java. Script) mongodb myfile. js ² La prima istruzione dello script contiene la connessione al server Mongo. DB, ed al database su cui si vuole operare: conn = new Mongo(); db = conn. get. DB("tennis");
Introduzione ai database No. SQL ² Il file di script può contenere costrutti iterativi e/o di selezione: while(condizione) { LISTACOMANDI} if(condizione) { LISTACOMANDI } else { LISTACOMANDI } ² I cursori vengono usati per scorrere il risultato di una query. cursor = db. collection. find(…); while ( cursor. has. Next() ) { printjson( cursor. next() ); }
Introduzione ai database No. SQL conn = new Mongo(); MYSCRIPT. js db = conn. get. DB("tennis 2"); db. create. Collection("soci"); cursor = db. collection. find({name=“mario”}); while (cursor. has. Next()) { printjson(cursor. next()); } cursor = db. collection. find({name=“mario”}); if (cursor. has. Next()) { print(“Trovato!”); }
Introduzione ai database No. SQL ² Supponiamo di dover rappresentare correlazioni tra collezioni in Mongo. DB. Es. Circoli Tennis e Soci dei Circoli ² Mongo. DB (come tutti i sistemi No. SQL) non mette a disposizione i costrutti di vincoli di integrità referenziale tra collezioni/tabelle. ² Mongo. DB (come tutti i sistemi No. SQL) non supporta il join tra collezioni!
Introduzione ai database No. SQL ² Le correlazioni possono essere espresse mediante campi _id replicati tra più collezioni… db. circoli. insert({_id: Object. Id(‘ 120’), name: ‘Nettuno’}) db. soci. insert({name: ’Mario’, cognome: ‘Rossi’, circolo: Object. Id(‘ 120’)})
Introduzione ai database No. SQL ² Le associazioni uno-a-molti, o molti-a-molti, tra documenti di diverse collezioni possono essere rappresentate sfruttando il fatto che in Mongo. DB il valore di un campo può essere anche un array, o una struttura complessa (es. documento annidato). db. soci. insert({name: ’Mario’, cognome: ‘Rossi’, circolo: [Object. Id(‘ 120’), Object. Id(‘ 150’) Object. Id(‘ 200’)})
Introduzione ai database No. SQL ² Problema: come scrivere la query che restituisce nome e cognome dei soci che partecipano a circoli situati a Bologna, senza usare il JOIN? ² Soluzione: usare 2 query! db. circoli. find({luogo: ’Bologna’}, {}) >> {_id: ’ 432’} db. soci. find({circolo: ’ 432’}, {nome: 1, cognome: 1})
Introduzione ai database No. SQL ² Sharding Processo di suddivisione dei dati su un cluster di server Mongo. DB (database distribuito). Perché distribuire i dati? ² Maggior storage ² Maggiore capacità computazionale ² Ridondanza dei dati ² Disponibilità del servizio ²…
Introduzione ai database No. SQL ² Q. Come effettuare la suddivisione dei dati? ² Necessità di definire una shard key. ² La chiave deve essere presente su tutti i documenti di una collezione! ² In base al valore della chiave, si suddivide la collezione in segmenti (chunks). ² Gruppi di chunk vengono assegnati ai diversi nodi del cluster. . Come effettuare l’allocazione?
Introduzione ai database No. SQL (SOLUZIONE 1) RANGE-BASED SHARDING q Individua valore massimo e minimo della chiave q Ogni chunk corrisponde ad un intervallo [K-i, K+i]
Introduzione ai database No. SQL (SOLUZIONE 2) HASH-BASED SHARDING q Mongo. DB applica la funzione hash(#chunk) q Il risultato della funzione determina il server.
Introduzione ai database No. SQL ² Ottimizzazioni a run-time: Splitting q Se un chunk cresce troppo in dimensione, esso viene splittato in più parti. q L’operazione viene eseguita su un server, e non comprende la migrazione del chunk stesso.
Introduzione ai database No. SQL ² Ottimizzazioni a run-time: Balancing q Il Balancer viene eseguito in background e tiene traccia del numero di chunk gestito da ciascun server. q In caso di allocazione non bilanciata, il Balancer provvede a migrare i chunk tra server differenti (dal più carico al più scarico).
- Slides: 44