Introduzione a NoSQL Giuseppe Terribilio
Cos’è NoSQL NoSQL (Not only SQL) è un termine utilizzato per descrivere database che non usano un modello di dati relazionale e quindi potrebbero non usare SQL come linguaggio di interrogazione utilizzano una serie di modelli di dati, tra cui documenti, grafi, coppie chiave-valore e colonne.
Classificazione DB NoSQL (1) orientate al documento: non memorizzano i dati in tabelle con campi uniformi per ogni record come nei DB relazionali ma ogni record è memorizzato come un documento. Per ogni documento può essere aggiunto un numero qualsiasi di campi con qualsiasi lunghezza. I campi possono anche contenere pezzi multipli di dati. Lotus Notes, MongoDB, Apache Solr, OrientDB, Elasticsearch, CouchDB
Classificazione DB NoSQL (2) database a grafo: usa nodi e archi per rappresentare e archiviare l’informazione. più veloci nell’associazione di set di dati. mappano in maniera più diretta le strutture di applicazioni orientate agli oggetti. Core Data, Neo4j, OrientDB
Classificazione DB NoSQL (3) chiave/valore archiviato su disco chiave/valore cache in RAM valore/chiave Eventually‐consistente chiave-valore che conserva mediante l'implementazione di Paxos basi di dati multivalore ad oggetti: l’informazione è rappresentata in forma di oggetti come nei linguaggi di programmazione ad oggetti. tabulare archiviazione in tuple
Vantaggi NoSQL leggerezza computazionale: i database NoSQL non prevedono operazioni di aggregazione sui dati (JOIN) in quanto tutte le informazioni sono già raccolte in un unico documento associato all’oggetto da trattare. assenza di schema: i database NoSQL sono privi di schema in quanto il documento contiene tutti i campi necessari scalabilità orizzontale: l’aggregazione dei dati e l’assenza di uno schema definito a priori offre l’opportunità di scalare orizzontalmente i database NoSQL senza difficoltà e rischi operativi (può essere quindi utilizzato per applicazioni standard che ambienti enterprise aggiungendo o sottraendo macchine per modificare potenza e capacità di calcolo)
Svantaggi NoSQL duplicazione delle informazioni: in realtà, i costi sempre meno proibitivi dei sistemi di storage rendono questo svantaggio poco importante.
Chi usa i database NoSQL Facebook Twitter Instagram per garantire velocità di esecuzione anche nell’elaborazione di terabyte e terabyte di dati, la scalabilità orizzontale con l’aggiunta di nuovi server e la possibilità di ricevere migliaia di dati non strutturati senza dipendere da uno schema fisso
MongoDB: cos’è MongoDB (da "humongous", gigantesco) è un database NoSQL orientato ai documenti, che nasce nel 2007 in California. memorizza i documenti in JSON, formato basato su JavaScript e più semplice di XML i documenti sono raggruppati in collezioni che possono essere anche eterogenee. Ciò significa che non c’è uno schema fisso per i documenti. Tra le collezioni non ci sono relazioni o legami garantiti da MongoDB: in altre parole, non esiste un concetto analogo al vincolo di integrità referenziale.
mongod --dbpath /home/giuseppe/mongodata Installazione http://www.mongodb.org/downloads creare folder mongodata sotto la propria user folder per memorizzare i file del database avviare il server: mongod --dbpath /home/giuseppe/mongodata Se tutto è andato a buon fine vedremo una schermata che indica che il server è avviato e su quale porta è in ascolto.
Quick start per interagire con il server c’è bisogno di un client. La client console si chiama mongo aprire un altro prompt e lanciare: mongo
db.myCollection.insertOne( { x: 1 } ); mongo Shell Di seguito alcuni comandi fondamentali: db: mostra il nome del database che si sta attualmente utilizzando (dovrebbe ritornare test, che è il database di default) show dbs: mostra i database disponibili use <database>: permette di switchare su un altro database. Se il database non esiste viene creato e avviene lo switching sul nuovo DB appena creato Note: su MongoDB non esiste alcun comando per creare in modo esplicito un database. db.myCollection.find(): visualizza i documenti presenti nella collezione myCollection Note: anche le collezioni vengono create implicitamente al primo utilizzo, quindi non occorre un comando specifico. Es.: db.myCollection.insertOne( { x: 1 } );
{name:’myName’, surname:’mySurname’, age:myAge} Esercizio 1 creare un db ictits creare una collezione users aggiungere 10 nuovi documenti {name:’myName’, surname:’mySurname’, age:myAge} elencare tutti i documenti presenti nella collezione
Interrogazione Note: per ogni documento viene creato un identificatore univoco _id che viene aggiunto come campo al documento stesso db.websites.find({ name: "Giuseppe" }): il metodo find permette di eseguire query includendo anche parametri di filtraggio dei risultati db.websites.find({name:/Giu/}, { _id: 1, name: 1 }): effettua una proiezione dei risultati ottenuti. In questo caso si sta cercando tra i documenti che contengono nel campo name la stringa Giu e per ogni documento trovato viene restituito solo il campo _id e il campo name db.books.find( { $or: [ { pages: { $lte: 200 } } , { published: { $gt: new Date(2014, 0, 1) } } ] }): restituisce i libri che hanno meno di 200 pagine o che sono stati pubblicati dal 2014 db.websites.find( { clicks: { $lt: 5000 } }, { _id: 1, clicks: 1 } ).limit(10): in questo caso vengono restituiti solo i primi 10 risultati
Operatori di confronto Nell’ultimo esempio si può osservare un filtraggio per confronto: il campo clicks di ogni documento viene confrontato con il valore 5000, e solo quelli con valore numerico inferiore saranno selezionati (lt sta infatti per lesser than). Altri operatori tipici sono: $gt (maggiore); $ne (non uguale a); $in (ricerca di un valore all’interno di un array).
Aggiornamento db.websites.update( { name: "homepage"}, { $set : { clicks: 5403 } }, {multi: true} ): aggiorna i documenti che hanno il campo name uguale a homepage settando il campo clicks a 5403. Il parametro multi serve per specificare che potranno essere aggiornati anche più di un documento (se non viene specificato, di default, ne viene aggiornato solamente uno)
Eliminazione db.websites.remove({ name:"homepage"}): il primo parametro rappresenta il criterio di selezione dei documenti da eliminare. Il server restituisce un documento che indica quanti documenti sono stati eliminati. Nel caso in cui non venga specificato un filtro di selezione, saranno eliminati tutti i documenti (db.websites.remove({}))
https://robomongo.org/ Robomongo manager con interfaccia grafica che permette di usare MongoDB https://robomongo.org/
Driver Java per i più importanti e utilizzati linguaggi di programmazione sono state realizzate delle librerie (o Driver, come si dice nell’ambito della gestione di database) per l’interfacciamento con MongoDB in modo semplice e intuitivo vedremo come interagire con MongoDB da un’applicazione JAVA scaricare da http://central.maven.org/maven2/org/mongodb/mongo-java- driver/3.4.1/ il file mongo-java-driver-3.4.1.jar creare un file Mongo.java nella stessa folder dove è presente mongo- java-driver-3.4.1.jar
Driver Java (2) import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; import com.mongodb.ServerAddress; import com.mongodb.client.MongoDatabase; import com.mongodb.client.MongoCollection; import org.bson.Document; import com.mongodb.client.MongoCursor; import static com.mongodb.client.model.Filters.*; import com.mongodb.client.result.DeleteResult; import static com.mongodb.client.model.Updates.*; import com.mongodb.client.result.UpdateResult; import java.util.ArrayList; import java.util.List;
Driver Java (3) class Mongo { public static void main(String[] args) { /**** Get database ****/ MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); //MongoClientURI connectionString = new MongoClientURI("mongodb://localhost:27017"); //MongoClient mongoClient = new MongoClient(connectionString); /**** Access database ****/ MongoDatabase database = mongoClient.getDatabase("test"); /**** Access a Collection ****/ //If a collection does not exist, MongoDB creates the collection when you first store data for that collection. MongoCollection<Document> collection = database.getCollection("myCollection"); /**** Create Document ****/ Document doc = new Document("name", "MongoDB") .append("type", "database") .append("count", 1) .append("versions", "3.0") .append("info", new Document("x", 203).append("y", 102)); Document myDoc = collection.find().first(); System.out.println(myDoc.toJson()); }
Driver Java (4) per compilare l’applicazione: javac -cp "mongo-java-driver-3.4.2.jar" Mongo.java per eseguire l’applicazione: java -cp "mongo-java-driver-3.4.2.jar";. Mongo