Visualizzazione post con etichetta mongodb. Mostra tutti i post
Visualizzazione post con etichetta mongodb. Mostra tutti i post

giovedì, gennaio 29, 2015

Mongodb su mongolab

Vogliamo aggiornare la nostra splendida applicazione su https://whispering-peak-1284.herokuapp.com/, inserendo una persistenza vera dei dati.

Vi ricordo che i nostri libri sono memorizzati in un array in memoria all'avvio dell'applicazione, eventuali nuovi libri inseriti rimangono solo fino al prossimo riavvio.

La nostra applicazione su heroku deve poter comunicare con un server di base dati, vogliamo ovviamente scegliere mongodb; heroku fornisce come addson (modulo aggiuntivo) la possibilità di far interagire una applicazione ivi installata con una istanza di mongodb ospitata da un'altra società che offre servizi di memorizzazione dati su mongodb, questa società si chiama mongolab.

Purtroppo per poter utilizzare direttamente mongolab da heroku, bisognerebbe fornire la carta di credito anche si decidesse, come noi, di utilizzare una istanza limitata gratuita per scopi di testing e sviluppo.

Pazienza faremo a manina.

Createvi direttamente un account su mongolab, effetuate l'accesso e pigiate sul bottone create new, come mostrato in figura, per creare una nuova base dati.


Nella schermata successiva, selezionate le seguenti opzioni
  • Location: Amazon's EU (Ireland) Region (eu-west-1)
  • Plan: Single-node, Sandbox
  • Database name: bibliotecadb
Premete il bottone create new MongoDB deployment per creare una base dati mongodb dal nome bibliotecadb.


Nella schermata successiva, premete sul link bibliotecadb


Nella prossima schermata troveremo le informazioni di connessione che utilizzeremo sia da robomongo per gestire la nostra base dati sia dall'applicazione residente su heroku.

Nel mio caso l'indirizzo di connessione è ds037601.mongolab.com:37601/bibliotecadb nel vostro caso sarà ovviamente diverso: prendetene nota.

Ora non ci rimane che creare un'utenza di accesso alla base dati appena creata, ce lo dice anche mongolab con questo messaggio terrorizzante A database user is required to connect to this database.  Click here to create e new one : premete sul link click here e inserite le seguenti informazioni nella maschera successiva
  • Database username: biblioteca
  • Database password: biblioteca
  • Confirm password: biblioteca

Premete il bottone create e la nostra base dati è pronta a ricevere istruzione dall'esterno.

Ora eseguite robomongo e create una nuova connessione inserendo i dati di connettività, il nome della base dati e l'utenza definiti precedentemente.




Sostituite il campo address con l'indirizzo assegnato alla vostra base dati.
Il campo name è solo un nome logico che robomango utilizza per memorizzare i dati di una particolare connessione.

Selezionate poi il pannello Authentication e inserite i seguenti dati, coerentemente a quanto fatto in precedenza


Pigiate il bottone Test per verificare la correttezza dei dati di connettività, se non avete fatto errori dovreste ottenere la schermata seguente


Salvate i dati di connessione e siamo ora pronti a connetterci alla nostra base dati su mongolab


Una volta connessi, creiamo una nuova collezione libri: tasto destro su Collections



Tasto destro su Collections/libri ...


Selezioniamo Insert Document e inseriamo le proprietà del nuovo libro da salvare


Ripetiamo il passo precedente per inserire un altro paio di libri e per eseguire una db.libri.find(): tasto destro su Collections/libri e selezioniamo View Documents.

Dovreste ottenere una schermata con la lista dei libri che avete inserito.


Abbiamo dunque creato una base dati utlilizzando mongodb su mongolab, non resta che modificare la nostra applicazione per leggere e scrivere i dati da essa.

Alla prox.
Ivan

martedì, gennaio 27, 2015

MongoDB: operazioni CRUD e Robomongo

MongoDB memorizza i dati nella forma di documenti che non sono altro che coppie di chiavi/valore alla stregua del formato json.
 {  
   nome : 'ivan',                            chiave: valore  
   età: '43',                                chiave: valore  
   linguaggi: ['java', 'javascript']         chiave: valore  
 }  
Tutti i documenti sono memorizzati in collezioni. 

Una collezione è un gruppo di documenti correlati che hanno un insieme di indici condivisi.
Spesso una collezione di mongodb viene considerata alla stregua di una tabella di una base dati relazionale: mi sembra una forzatura visto che i documenti presenti in una collezione non devono avere la stessa struttura.

In mongodb, le interrogazioni (query) vengono effettuate su delle collezioni; possono specificare dei criteri per filtrare i risultati e possono includere una proiezione per ottenere solo determinate coppie chiavi/valore dei documenti ricercati; si possono opzionalmente impostare limiti e criteri di ordinamenti.
Ecco un esempio di query che cerca nella collezione dipendenti quelli che sono maggiorenni e i risultati sono ordinati per cognome in maniera crescente.
   Collezione     Criterio     Ordinamento  
 db.dipendenti.find({età: {$gt: 18}}).sort({cognome: 1})  
In questo esempio, cerchiamo i primi 5 utenti, in ordine alfabetico per nome, che abbiano meno di 50 anni: di questi utenti ci interessa solo il nome e l'indirizzo: la query ritorna comunque la proprietà _id per ogni documento.
 Collezione            Criterio            Proiezione      Ordinamento  Limite  
 db.utenti.find({età: {$lt: 50}}, {nome: 1, indirizzo :1}).sort({nome:1}).limit(5)  
Il metodo find torna sempre un cursore; se eseguito in una shell mongo e il risultato del metodo non viene assegnato ad una variabile, la shell itera i primi 20 risultati mostrandoli a video: un uso programmatico del cursore sarebbe il seguente, tenendo conto che nella shell mongo viene utilizzato un linguaggio di scripting quasi identico a javascript
 var cursore = db.libri.find()  
   
 while(cursore.hasNext()) {  
    printjson(cursore.next())  
 }  
 
 //oppure  
   
 cursore.forEach(printjson)  
Molto intuitivamente: finchè ci sono elementi nel cursore, viene stampanto il prossimo elemento puntato dal cursore stesso, la stampa avviene in formato json.

Per aggiornare un documento esistente, la sintassi è la seguente
 db.libri.update(  
    {  
       titolo: 'la guerra'         
    },  
    {  
       $set {  
          autore: 'Ancora non lo so'  
       }  
    }  
 )  
Con questa istruzione aggiorniamo la proprietà autore del documento la cui proprietà titolo vale 'la guerra'; il metodo update aggiorna solo un documento alla volta, se vogliamo aggiornare più documenti dobbiamo aggiungere l'opzione {multi : true} come terzo parametro.

Per eliminare un documento, la sintassi è la seguente
 Rimuove il libro dal titolo 'la guerra' dalla collezione libri:
   
 db.libri.remove({titolo: 'la guerra'})  
   
 Svuota la collezione libri: 
   
 db.libri.remove({})  
Se volete utilizzare un client mongo più amichevole rispetto alla linea di comando, vi consiglio di scaricare e installare l'applicazione gratuita robomongo .

All'avvio dell'applicazione, create una nuova connessione verso localhost come mostrato in figura


Connettetevi con il tasto connect e avrete la possibilità di eseguire le query in una shell che fornisce anche funzionalità di autocompletamento sintassi.

Il programma è molto intuitivo, non farete fatica ad utilizzarlo come si deve.



Bene, nel prossimo post, saremo pronti a mettere la nostra base dati online per essere accessibile dal mondo intero :)

Alla prox.
Ivan

lunedì, gennaio 26, 2015

MongoDB un motore di basi dati senza schema!

Prima domanda da porsi: cosa è mongodb?

Mongodb è un dbms (database management system) orientato ai documenti, dove per documenti si intendono informazioni strutturate in formato json.

Mongodb è una base dati nosql: non esiste il concetto di schema (regole sulla struttura dei dati) e dunque non esiste il concetto di tabella, si ha la massima libertà nel memorizzare i propri dati senza vincoli di struttura e, men che meno, di integrità referenziale

In mongodb non esistono le tabelle, ma esistono le collezioni: contenitori di documenti che non impongono vincoli sulla struttura dei dati in essi contenuti.

Installiamo ora mongodb sulla nostra macchina: procuriamoci il pacchetto d'installazione opportuno all'indirizzo https://www.mongodb.org/downloads ed eseguiamolo, scegliendo le impostazioni standard.

Mongodb, se non diversamente specificato durante il suo avvio, si aspetta di memorizzare i dati nella cartella /data/db; se siete utenti di windows create la cartella c:/data/db con una shell eseguita con i diritti di amministratore (tasto WIN + r  e poi  CTRL + SHIFT  + ENTER).

Il programma d'installazione dovrebbe aggiornare la variabile di ambiente PATH, aggiungendo un percorso del tipo C:\Program Files\MongoDB 2.6 Standard\bin; in modo da poter eseguire il server ed il client da qualsiasi percorso in cui vi troviate.

Siamo pronti ad avviare il server: aprite una finestra dos tasto WIN + r  e poi  CTRL + SHIFT  + ENTER) e digitate mongod: il server partirà, di default, sulla porta 27017 e rimarrà in attesa di richiesta di connessioni.


Se volessimo utilizzare un altro percorso dove memorizzare i dati e/o un'altra porta, dovremmo, ad esempio, digitare il comando mongod --dbpath "d:\test\mongo db data" --port 28000

Apriamo adesso un'altra shell dos (tasto WIN + r  e poi  CTRL + SHIFT  + ENTER) ed eseguiamo il programma client tramite il comando mongo: il client proverà a connettersi, di default, ad un server presente su localhost e su porta 27017.


In figura possiamo notare a sinistra, la shell che ci permetterà di eseguire comandi da mandare al server; a destra notiamo il server che ha accettato una connessione.

Per spegnere il server basterà digitate CTRL + c dalla rispettiva shell.

Di default, il client si connette ad una base di dati chiamata test, per cambiare base dati di riferimento di utlizza il comando use nomedb: se la base dati nomedb non esiste, verrà creata successivamente quando salveremo in essa un nuovo documento in una nuova collezione.

Creiamo ora una base dati per la memorizzazione dei libri della nostra biblioteca.
  1. Creiamo la base dati con use biblioteca
  2. Memorizziamo il primo libro, nella collezione libri, con l'istruzione
    db.libri.insert({titolo: 'La guerra', codiceisbn: 'AEDRFFF', autore: 'Boh!'})
  3. Memorizziamo un ulteriore libro con
    db.libri.insert({titolo: 'Pace', codiceisbn: 'ZEDRR', autore: 'Riboh!'})
Il server creerà la base dati biblioteca e la collezioni libri contenente i due documenti (libri), rappresentati in formato json.
  • Per vedere la lista delle basi di dati gestite dal nostro server, digitatiamo show dbs.
  • Per sapere qual è la base dati corrente, digitiamo db
  • Per cambiare base dati corrente, digitiamo use nomebasedati
  • Per vedere la lista delle collezione della base dati corrente, digitiamo show collections
  • Per visualizzare i documenti della collezione libri, digitiamo db.libri.find()
Tutti i documenti inseriti in mongodb, devono avere una proprietà _id univoca: se non la si specifica in fase di inserimento, mongodb genererà automoticamente tale proprietà garantendone l'univocità.

Per concludere vediamo un esempio di estrazione: vogliamo tutte le informazioni relative al libro che ha codiceisbn = 'ZEDRR':

  • db.libri.find({codiceisbn:'ZEDRR'})
Nel prossimo post, cercheremo di creare una base dati raggiungibile dalla nostra applicazione installata su heroku: spero sia ovvio che non potremo utlilizzare la nostra macchina per ospitare la base dati :).

Alla prox.
Ivan