{"id":11902,"date":"2016-08-25T17:31:50","date_gmt":"2016-08-25T15:31:50","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=11902"},"modified":"2016-08-25T17:31:50","modified_gmt":"2016-08-25T15:31:50","slug":"introduzione-a-mongodb-e-ai-database-nosql","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/introduzione-a-mongodb-e-ai-database-nosql\/","title":{"rendered":"Introduzione a MongoDB e ai database NoSQL"},"content":{"rendered":"<p>Da alcuni anni, l&#8217;informatica ha visto la diffusione del cosiddetto movimento <strong>NoSQL<\/strong> che ha proposto, con successo, <strong>alternative allo sviluppo di database relazionali<\/strong>. Chiariamo subito che NoSQL non \u00e8 &#8211; come potrebbe sembrare &#8211; un netto rifiuto del linguaggio SQL ma la sintesi di &#8220;Not only SQL&#8221; quindi un approccio che mira ad aprire gli orizzonti dei progettisti software.<\/p>\n<p>I database tradizionalmente sono basati sull&#8217;approccio relazionale dove tutti i dati sono scritti in <em>tabelle<\/em> messe in relazione tra loro tramite <em>chiavi<\/em>. Questo metodo \u00e8 fortemente strutturato infatti si sa che il primo passo per progettare un database consiste nel definire la struttura delle tabelle: ogni riga in essa inserita &#8211; solitamente detta <em>record<\/em> &#8211; avr\u00e0 tutti i comandi previsti, anche se di valore nullo. Inoltre i database relazionali sono dominati dalle cosiddette <em>propriet\u00e0 acide<\/em>, termine derivato dalla sigla ACID (Atomicity-Consistency-Isolation-Durability), secondo le quali le <em>transazioni<\/em> di interazione con il database devono essere\u00a0<em>atomiche<\/em> (le operazioni che le compongono\u00a0devono andare in porto tutte altrimenti\u00a0l&#8217;intera transazione sar\u00e0 annullata), <em>consistenti<\/em> (non devono violare la coerenza dei dati presenti nel database), <em>isolate<\/em> (gli effetti di due transazioni concorrenti devono essere gli stessi di una loro esecuzione\u00a0in cascata) e <em>duraturi<\/em> (quando la transazione \u00e8 conclusa i suoi risultati devono essere persistenti nel database).<\/p>\n<p>I software NoSQL hanno conquistato i favori di buona parte del mondo informatico nonostante abbiano stravolto le concezioni alla base dei database relazionali come l&#8217;obbligatoriet\u00e0 della struttura delle tabelle e l&#8217;inviolabilit\u00e0 delle propriet\u00e0 acide.<\/p>\n<p>In questo post presentiamo <a href=\"https:\/\/www.mongodb.org\/\" target=\"_blank\">MongoDB <\/a>considerato uno dei DBMS pi\u00f9 usati al mondo. Lo vedremo all&#8217;opera in un breve viaggio\u00a0che ci porter\u00e0 dalla sua installazione fino all&#8217;utilizzo delle principali operazioni sui dati.<\/p>\n<h2>Installare MongoDB<\/h2>\n<p>MongoDB \u00e8 un progetto open source e multipiattaforma pertanto possiamo creare la nostra installazione su ogni sistema operativo. Alla pagina dei\u00a0<a href=\"https:\/\/www.mongodb.org\/downloads#production\" target=\"_blank\">Download<\/a>, vengono messe a disposizione sorgenti e file binari di diverse versioni. Molte distribuzioni Linux offrono pacchetti di installazione gi\u00e0 pronti che possono essere un modo molto comodo per iniziare a sperimentarlo subito: unico neo \u00e8 che tali versioni non sono molto aggiornate.<\/p>\n<p>Noi proveremo MongoDB su un&#8217;installazione Ubuntu Server 14.04, ottenendolo tramite pacchetti offerti dalla distribuzione, ma tutto quello che diremo nei prossimi paragrafi a proposito di questo prodotto sar\u00e0 di utilit\u00e0 universale.<\/p>\n<p>Nella nostra macchina Ubuntu, sar\u00e0 sufficiente acquisire i privilegi da super-user e digitare:<\/p>\n<pre class=\"lang:sh decode:true\">&gt; apt-get update\r\n&gt; apt-get install mongodb<\/pre>\n<p>Il procedimento di installazione preparer\u00e0 l&#8217;ambiente sulla nostra postazione\u00a0e, soprattutto, metter\u00e0 a disposizione il server, <em>mongod<\/em>, e la console che useremo per inviare comandi, <em>mongo<\/em>.<\/p>\n<h2>Usiamo MongoDB: creazione e lettura di documenti<\/h2>\n<p>Il bello del NoSQL \u00e8 che possiamo iniziare ad inserire dati, a sperimentare immediatamente senza passare tempo a progettare tabelle e strutture.<\/p>\n<p>MongoDB segue la filosofia <strong>&#8220;a documenti&#8221;<\/strong>, una delle varie che popolano il mondo NoSQL, quindi tutto ci\u00f2 che nel relazionale consideravamo un record ora \u00e8 un documento, strutturato fisicamente come oggetto JSON. Pi\u00f9 documenti insieme compongono il corrispondente di una tabella relazionale che\u00a0in MongoDB prender\u00e0 il nome di\u00a0Collection.<\/p>\n<p>Avviato il servizio <em>mongod<\/em>, attiveremo la console invocando il comando <em>mongo<\/em>.<\/p>\n<p>Appena risponde il prompt di MongoDB, digitiamo quanto segue:<\/p>\n<pre class=\"lang:sh decode:true\">&gt; use nuovidocumenti;<\/pre>\n<p>In pratica, stiamo chiedendo di utilizzare il database nuovidocumenti che, se non esiste, viene creato all&#8217;istante. Da ora, questo sar\u00e0 il database attivo e nella console vi faremo riferimento tramite l&#8217;oggetto db.<\/p>\n<p>Inseriamo dei dati al suo interno:<\/p>\n<pre class=\"lang:sh decode:true\">&gt; db.persone.insert({\"nome\":\"carlo\", \"cognome\":\"rossi\", \"eta\":34, \"automunito\":true});<\/pre>\n<p>Con questo, stiamo chiedendo di inserire nella collection denominata <em>persone<\/em> &#8211; se non esiste sar\u00e0 definita\u00a0all&#8217;istante anch&#8217;essa &#8211; un nuovo documento\u00a0per il quale saranno specificate\u00a0propriet\u00e0 e valori tramite un oggetto JSON.<\/p>\n<p>Inseriamone altri:<\/p>\n<pre class=\"lang:sh decode:true\">&gt; db.persone.insert({\"nome\":\"elio\", \"cognome\":\"verdi\", \"eta\":21, \"automunito\":true});\r\n&gt; db.persone.insert({\"nome\":\"silvia\", \"cognome\":\"gialli\", \"eta\":31, \"automunito\":true});\r\n&gt; db.persone.insert({\"nome\":\"elena\", \"cognome\":\"bianchi\", \"eta\":28, \"automunito\":false});<\/pre>\n<p>Possiamo ora vedere il contenuto della nostra collection tramite la funzione <em>find()<\/em>:<\/p>\n<pre class=\"lang:sh decode:true\">{ \"_id\" : ObjectId(\"56f82b528d2acfe22e933763\"), \"nome\" : \"carlo\", \"cognome\" : \"rossi\", \"eta\" : 34, \"automunito\" : true }\r\n{ \"_id\" : ObjectId(\"56f82b638d2acfe22e933764\"), \"nome\" : \"elio\", \"cognome\" : \"verdi\", \"eta\" : 21, \"automunito\" : true }\r\n{ \"_id\" : ObjectId(\"56f82b778d2acfe22e933765\"), \"nome\" : \"elena\", \"cognome\" : \"bianchi\", \"eta\" : 28, \"automunito\" : false }\r\n{ \"_id\" : ObjectId(\"56f82b948d2acfe22e933766\"), \"nome\" : \"silvia\", \"cognome\" : \"gialli\", \"eta\" : 31, \"automunito\" : true }\r\n<\/pre>\n<p>Come possiamo notare, ci sono tutti i dati che abbiamo inserito sinora con le quattro scritture ma ogni documento \u00e8 dotato di un ulteriore campo, denominato _id, che ne rappresenta l&#8217;identificatore univoco.<\/p>\n<p>La funzione <em>find()<\/em> permette anche di eseguire dei filtri, specificandone le condizioni in un\u00a0oggetto JSON che\u00a0svolger\u00e0 il ruolo del WHERE nelle query relazionali.<\/p>\n<p>Cerchiamo, ad esempio, tutti gli automuniti presenti nella collezione:<\/p>\n<pre class=\"lang:sh decode:true\">&gt; db.persone.find({\"automunito\":true});\r\n<\/pre>\n<p>Il risultato proposto in output evidenzier\u00e0 solo i documenti che vantano la propriet\u00e0 automunito impostata a true.<\/p>\n<p>Possiamo anche contare quanti sono i documenti nella collezione:<\/p>\n<pre class=\"lang:sh decode:true\">&gt; db.persone.find().count();<\/pre>\n<p>oppure contare quanti sono gli automuniti<\/p>\n<pre class=\"lang:sh decode:true\">&gt; db.persone.find({\"automunito\":true).count();<\/pre>\n<p>In base ai dati che abbiamo inserito, il primo comando restituir\u00e0 4, il secondo 3.<\/p>\n<p>La funzione find() ricopre un ruolo centrale in quanto concede accesso ad una collezione o ad un sottoinsieme dei suoi record. Come count(), possiamo applicare sort() ai risultati di find() per poterli ordinare, ad esempio:<\/p>\n<pre class=\"lang:sh decode:true\">&gt; db.persone.find().sort({\"nome\":1});\r\n<\/pre>\n<p>Con questo comando, tutti i documenti saranno ordinati per nome, in senso ascendente. L&#8217;oggetto JSON passato a sort() mostra la propriet\u00e0 in base alla quale si svolger\u00e0 l&#8217;ordinamento e il valore 1 che significa &#8220;ordinamento ascendente&#8221;. Questi i risultati:<\/p>\n<pre class=\"lang:sh decode:true\">{ \"_id\" : ObjectId(\"56f82b528d2acfe22e933763\"), \"nome\" : \"carlo\", \"cognome\" : \"Rossi\", \"eta\" : 34, \"automunito\" : true }\r\n{ \"_id\" : ObjectId(\"56f82b778d2acfe22e933765\"), \"nome\" : \"elena\", \"cognome\" : \"bianchi\", \"eta\" : 28, \"automunito\" : false }\r\n{ \"_id\" : ObjectId(\"56f82b638d2acfe22e933764\"), \"nome\" : \"elio\", \"cognome\" : \"verdi\", \"eta\" : 21, \"automunito\" : true }\r\n{ \"_id\" : ObjectId(\"56f82b948d2acfe22e933766\"), \"nome\" : \"silvia\", \"cognome\" : \"gialli\", \"eta\" : 31, \"automunito\" : true }<\/pre>\n<p>come si vede i documenti elencati sono riferiti a &#8220;carlo&#8221;, &#8220;elena&#8221;, &#8220;elio&#8221;, &#8220;silvia&#8221;.<\/p>\n<p>Con il comando<\/p>\n<pre class=\"lang:sh decode:true\">&gt; db.persone.find().sort({\"nome\":-1});<\/pre>\n<p>i documenti saranno presentati in ordine inverso:<\/p>\n<pre class=\"lang:sh decode:true\">{ \"_id\" : ObjectId(\"56f82b948d2acfe22e933766\"), \"nome\" : \"silvia\", \"cognome\" : \"gialli\", \"eta\" : 31, \"automunito\" : true }\r\n{ \"_id\" : ObjectId(\"56f82b638d2acfe22e933764\"), \"nome\" : \"elio\", \"cognome\" : \"verdi\", \"eta\" : 21, \"automunito\" : true }\r\n{ \"_id\" : ObjectId(\"56f82b778d2acfe22e933765\"), \"nome\" : \"elena\", \"cognome\" : \"bianchi\", \"eta\" : 28, \"automunito\" : false }\r\n{ \"_id\" : ObjectId(\"56f82b528d2acfe22e933763\"), \"nome\" : \"carlo\", \"cognome\" : \"rossi\", \"eta\" : 34, \"automunito\" : true }\r\n<\/pre>\n<h2>Rimozione e modifica dei documenti<\/h2>\n<p>Oltre a lettura ed inserimento, \u00e8 possibile anche cancellare e rimuovere dati con la console di mongo.\u00a0La rimozione opera sulla collection mediante la funzione<em> remove()<\/em>:<\/p>\n<pre class=\"lang:sh decode:true \">db.persone.remove({\"cognome\":\"verdi\"});<\/pre>\n<p>Il comando appena visto cancella tutti i documenti che possiedono una propriet\u00e0 &#8220;cognome&#8221; il cui valore \u00e8 impostato a &#8220;verdi&#8221;. Anche in questo caso un oggetto JSON \u00e8 stato utilizzato per definire quella che in un comando per database relazionali sarebbe la clausola WHERE.<\/p>\n<p>Nella funzione <em>update()<\/em>, dovremo passare due oggetti JSON per attuare la modifica: il primo servir\u00e0 per filtrare i documenti che subiranno la modifica, il secondo descriver\u00e0 le operazioni da svolgere.<\/p>\n<p>Con il comando<\/p>\n<pre class=\"lang:sh decode:true\">db.persone.update({\"cognome\":\"verdi\"},{ $set:{\"nome\":\"alfredo\"}});<\/pre>\n<p>cerchiamo tutti i documenti in cui il cognome \u00e8 impostato a &#8220;verdi&#8221; e modifichiamo il nome in &#8220;alfredo&#8221; qualunque esso sia. La descrizione della modifica \u00e8 stata definita come propriet\u00e0 $set del secondo oggetto per specificare che il contenuto restante del documento deve essere conservato.<\/p>\n<h2>Conclusioni<\/h2>\n<p>Quanto abbiamo visto in questo articolo non \u00e8 che un avvio rapido a MongoDB: poche indicazioni schematiche per avere chiari gli scopi del sistema, installarlo e svolgere le prime operazioni basilari. Ovviamente, c&#8217;\u00e8 ancora molto da approfondire tra cui, in primis, i modi con cui si pu\u00f2 affinare le ricerche della funzione <a href=\"https:\/\/docs.mongodb.org\/manual\/reference\/method\/db.collection.find\/\" target=\"_blank\">find()<\/a>, vista la centralit\u00e0 di questa nell&#8217;interazione con il database. Noi, da parte nostra, continueremo a mostrare usi ed applicazioni di questo DBMS includendo, come presumibile,\u00a0un ambiente ad esso particolarmente\u00a0congeniale: <a href=\"http:\/\/www.devapp.it\/wordpress\/introduzione-a-node-js\/\" target=\"_blank\">Node.js<\/a>.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Da alcuni anni, l&#8217;informatica ha visto la diffusione del cosiddetto movimento NoSQL che ha proposto, con successo,&#8230;<\/p>\n","protected":false},"author":561,"featured_media":12288,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1530,1652,1529,1716],"class_list":["post-11902","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-pratici","tag-database","tag-mongodb","tag-nosql","tag-tutorial-mongodb"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11902","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/561"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=11902"}],"version-history":[{"count":9,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11902\/revisions"}],"predecessor-version":[{"id":12289,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11902\/revisions\/12289"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/12288"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=11902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=11902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=11902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}