{"id":11972,"date":"2016-10-13T11:07:34","date_gmt":"2016-10-13T09:07:34","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=11972"},"modified":"2016-10-13T11:31:40","modified_gmt":"2016-10-13T09:31:40","slug":"mongoose-integrare-node-js-e-mongodb","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/mongoose-integrare-node-js-e-mongodb\/","title":{"rendered":"Mongoose: integrare Node.js e MongoDB"},"content":{"rendered":"<p>Spesso una tecnologia lato server crea un connubio solidissimo con un DBMS: se, ad esempio, <strong>PHP e MySQL<\/strong> hanno scritto la storia del web, l&#8217;epoca del NoSQL vede un forte affratellamento tra Node.js e MongoDB. Queste ultime tecnologie sono state anche poste alla base del cosiddetto <strong>stack MEAN<\/strong> (Mongo &#8211; Express &#8211; Angular.js &#8211; Node.js) che offre una struttura completa lato server con una flessibile controparte client.<br \/>\nDopo aver parlato su queste pagine singolarmente di Node.js e MongoDB, in questo post presentiamo una libreria utilissima alla loro fusione che mette a disposizione un contesto di lavoro efficiente e produttivo: oggi parliamo di <a href=\"http:\/\/mongoosejs.com\/\" target=\"_blank\">Mongoose<\/a>.<\/p>\n<p>Mongoose funziona in\u00a0stile ORM: in pratica, forniamo\u00a0uno schema di lavoro &#8211; detto <em>Model<\/em> &#8211; che riassume la struttura di una tipologia di dati da salvare\u00a0in MongoDB e, successivamente, la usiamo per istanziare oggetti che saranno automaticamente dotati di metodi per svolgere le classiche operazioni\u00a0CRUD. Tutti i dati cos\u00ec inseriti e trattati saranno immagazzinati in\u00a0MongoDB ma in una maniera cos\u00ec comoda che la sua presenza passer\u00e0 inosservata.<\/p>\n<h2>Iniziamo ad usare Mongoose<\/h2>\n<p>Per integrare Mongoose passiamo, come al solito, per <em>npm<\/em>, digitando nella nostra directory di lavoro:<\/p>\n<pre class=\"lang:js decode:true \">$ npm init\r\n$ npm install mongoose --save<\/pre>\n<p>Nel nostro esempio, avremo a disposizione un&#8217;istanza di MongoDB che sar\u00e0 contattabile all&#8217;indirizzo localhost, alla porta 27017. Creeremo un database che chiameremo Geonotes in cui potremo registrare delle note geolocalizzate composte\u00a0da titolo, testo, descrizione del luogo, date di creazione e modifica nonch\u00e8 un ulteriore oggetto JSON in cui segneremo latitudine e longitudine del luogo in cui prendiamo l&#8217;appunto.<br \/>\nCreiamo il nostro Model per Mongoose in cui dettiamo\u00a0lo schema che le note devono seguire\u00a0e lo facciamo in un modulo Node.js:<\/p>\n<pre class=\"lang:js decode:true \">var mongoose = require('mongoose');\r\n\r\nmongoose.connect('mongodb:\/\/localhost\/geonotes');\r\n\r\nvar Schema = mongoose.Schema;\r\n\r\nvar notesSchema = new Schema({\r\n  title: String,\r\n  text: String,\r\n  place: String,\r\n  position: {\r\n    latitude: Number,\r\n    longitude: Number\r\n  },\r\n  created: Date,\r\n  updated: Date\r\n});\r\n\r\nvar Geonote = mongoose.model('Geonotes', notesSchema);\r\n\r\nmodule.exports = Geonote;<\/pre>\n<p>Salveremo il codice appena visto nel file geonote_module.js e lo utilizzeremo nei nostri programmi per Node.js. Essenzialmente, in esso, abbiamo richiesto l&#8217;utilizzo del modulo mongoose e poi ci siamo connessi\u00a0alla nostra installazione di MongoDB. Creiamo un oggetto Schema che rappresenta la forma delle note: pu\u00f2 contenere oggetti annidati e per ogni propriet\u00e0 suggeriamo il tipo di dato che dovr\u00e0 rappresentarla (per un approfondimento su quali sono i tipi di dato validi si pu\u00f2 consultare la <a href=\"http:\/\/mongoosejs.com\/docs\/schematypes.html\" target=\"_blank\">documentazione<\/a> del progetto).<\/p>\n<h2>Inserimento dati<\/h2>\n<p>Per provare il Model che abbiamo preparato, vediamo un semplice programma Node.js in cui inseriamo tre note. Si faccia solo caso che al fine di provare lo script pi\u00f9 volte nonch\u00e8 di imparare un comando in pi\u00f9 su Mongoose la creazione dei dati \u00e8 preceduta dallo svuotamento della relativa Collection:<\/p>\n<pre class=\"lang:js decode:true\">var Geonote = require('.\/geonote_module');\r\n\r\n Geonote.remove({}, function(err) {\r\n            if (err) {\r\n                console.log(err)\r\n            } \r\n\t    else {console.log('cancellazione eseguita')}\r\n        }\r\n    );\r\n\r\nvar note1 = new Geonote({\r\n  title: 'Gita a Venaria',\r\n  text: 'Ci siamo tanto divertiti bla bla bla....',\r\n  place: 'Venaria',\r\n  position: {latitude: 45.137058, longitude: 7.621327},\r\n  created: new Date('2016-04-15'),\r\n  updated: new Date('2016-04-15')\r\n});\r\n\r\nvar note2 = new Geonote({\r\n  title: 'Giornata a Ivrea',\r\n  text: 'Siamo venuti per lavoro.....',\r\n  place: 'Nostri uffici a Ivrea',\r\n  position: {latitude: 45.459330, longitude: 7.872489},\r\n  created: new Date('2016-03-09'),\r\n  updated: new Date('2016-03-21')\r\n});\r\n\r\nvar note3 = new Geonote({\r\n  title: 'Festa di Luca',\r\n  text: 'Riuscita molto bene! ... ',\r\n  place: 'Casa di Luca',\r\n  position: {latitude: 45.068557, longitude: 7.641706},\r\n  created: new Date('2016-02-27'),\r\n  updated: new Date('2016-02-28')\r\n});\r\n\r\nnote1.save(function(err) {\r\n  if (err) throw err;\r\n\r\n  console.log('Salvataggio completato');\r\n});\r\n\r\nnote2.save(function(err) {\r\n  if (err) throw err;\r\n\r\n  console.log('Salvataggio completato');\r\n});\r\n\r\nnote3.save(function(err) {\r\n  if (err) throw err;\r\n\r\n  console.log('Salvataggio completato');\r\n});\r\n<\/pre>\n<p>Geonote rappresenta il modulo che abbiamo creato prima e con esso svolgiamo subito la cancellazione degli oggetti salvati nella collection: al posto di {} si potr\u00e0 usare un criterio pi\u00f9 specifico per cancellare un subset dei documenti inseriti.<\/p>\n<p>Per quanto riguarda gli inserimenti, creeremo degli oggetti secondo la struttura dettata dal Model e, per il loro immagazzinamento definitivo, invocheremo su di essi il metodo <em>save<\/em>.<\/p>\n<h2>Qualche query<\/h2>\n<p>Anche nello svolgimento di query Mongoose segue i classici comandi di MongoDB.<\/p>\n<p>Questa query, ad esempio, recupera le note che vedono &#8220;Venaria&#8221; come luogo di registrazione:<\/p>\n<pre class=\"lang:js decode:true\">Geonote.find({place: 'Venaria'}).exec(function(err, notes) {\r\n  if (err) throw err;\r\n  console.log(notes);\r\n});<\/pre>\n<p>mentre per recuperare tutti i documenti creati dopo il giorno 8 marzo 2016:<\/p>\n<pre class=\"lang:js decode:true\">Geonote.find({}).where('created').gt(new Date('2016-03-08')).exec(function(err, notes) {\r\n  if (err) throw err;\r\n\r\n  \/\/ show the admins in the past month\r\n  console.log(notes);\r\n});<\/pre>\n<p>Come si vede i documenti vengono selezionati in base al metodo <em>find<\/em> per poi essere, eventualmente, sottoposti a valutazioni tramite <em>where<\/em>: nella seconda query <em>where<\/em> specifica il campo da valutare e mediante <em>gt<\/em> (maggiore di) viene specificato il termine di paragone.<\/p>\n<h2>Conclusioni<\/h2>\n<p>Abbiamo cos\u00ec fatto una rapida introduzione a Mongoose, ambiente che mira a rendere pi\u00f9 produttivo\u00a0\u00a0lo sviluppatore nell&#8217;integrazione\u00a0di un database MongoDB in un&#8217;applicazione Node.js:\u00a0impiantiamo un Model e gestiamo subito i nostri dati. Restano inoltre aperte possibilit\u00e0 di estensione mediante ulteriori moduli che offrono nuove vie di interazione: il pensiero vola subito ad Express che in un contesto simile permette di esporre\u00a0il tutto tramite API REST.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Spesso una tecnologia lato server crea un connubio solidissimo con un DBMS: se, ad esempio, PHP e&#8230;<\/p>\n","protected":false},"author":561,"featured_media":12428,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[1652,1676,1529,1759],"class_list":["post-11972","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial-pratici","tag-mongodb","tag-nodejs","tag-nosql","tag-stack-mean"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11972","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=11972"}],"version-history":[{"count":7,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11972\/revisions"}],"predecessor-version":[{"id":12426,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11972\/revisions\/12426"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/12428"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=11972"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=11972"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=11972"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}