Dart e mongoDB

Di - 16 March 2013 - in
Post image for Dart e mongoDB

La scorsa settimana abbiamo visto come permettere l’interazione con un database MySQL in Dart e abbiamo mostrato una semplice applicazione di esempio. Oggi torniamo a parlare di database introducendo mongo_dart, libreria sviluppata da Vadim Tsushko che ci consente di stabilire una connessione con un mongDB, structured storage database appartenente ai sistemi NoSQL.

Per utilizzare la libreria nel nostro progetto aggiungiamo mongo_dart alle dipendenze nel file pubspec.yaml

dependencies:
  mongo_dart: any

e importiamola:

import 'package:mongo_dart/mongo_dart.dart';

Vediamo velocemente quali siano le funzioni principali della libreria:

  • open(): stabilisce una connessione con il database
  • drop(): svuota il database
  • collection(): seleziona la collezione da utilizzare
  • insert(): inserisce un nuovo elemento nella collezione
  • find(): crea un cursore per la query che può essere utilizzato per iterare i risultati da MongoDB
  • remove(): rimuove la collezione
  • close(): chiude la connessione

La documentazione completa, generata con dartdoc, è disponibile su GitHub.

Prepariamo la collezione “utenti” nel database “miodb” così da poter vedere qualche esempio pratico di mongo_dart in azione:

use miodb
db.utenti.insert( { "id":"1", "nome":"John Doe" , "email":"info@jdoe.com" } )
db.utenti.insert( { "id":"2", "nome":"Adrian Leverkuhun" , "email":"a.leverkuhun@email.com"} )
db.utenti.insert( { "id":"3", "nome":"Duncan Ewart", "email":"duncan@welsh.com"} )
db.utenti.insert( { "id":"4", "nome":"Raimond Gregorius", "email":"gregorius@coimbra.pt"} )

Creiamo un nuovo progetto nel Dart Editor, aggiungiamo la dipendenza mongo_dart e avviamo una connessione al database:

import 'package:mongo_dart/mongo_dart.dart';

main() {
  Db db = new Db("mongodb://127.0.0.1/miodb");
  db.open().then((_){
    print("Connessione stabilita");
  });
}

Il metodo open() restituisce un Future, di conseguenza il codice da eseguire quando la connessione è stabilita va definito come corpo di then(); aggiungiamo qualcosa:

main() {
  Db db = new Db("mongodb://127.0.0.1/miodb");
  db.open().then((_){
    print("Connessione stabilita");

    DbCollection collezione;
    collezione = db.collection("utenti");
    collezione.find().toList().then((List risultati){
      print("Risultati:");
      print(risultati);
    });
  });
}

Questo programma produce in output:

Connessione stabilita
Risultati:
[{_id: ObjectId(51435523ca4d1fa039bfcd13), id: 1, nome: John Doe, email: info@jdoe.com}, {_id: ObjectId(51435524ca4d1fa039bfcd14), id: 2, nome: Adrian Leverkuhun, email: a.leverkuhun@email.com}, {_id: ObjectId(51435524ca4d1fa039bfcd15), id: 3, nome: Duncan Ewart, email: duncan@welsh.com}, {_id: ObjectId(51435527ca4d1fa039bfcd16), id: 4, nome: Raimond Gregorius, email: gregorius@coimbra.pt}]

Per effettuare la ricerca nel database abbiamo usato il metodo find() di collezione, un oggetto di tipo DbCollection restituito da Db.collection(); i risultati di find() vengono convertiti in un oggetto di tipo List<Map>. La struttura della lista che viene restituita da find().toList() è la seguente:

[
    {
    "campo1" : "valore1",
    "campo2" : "valore2"
    } ,
    {
    "campo1" : "valore1",
    "campo2" : "valore2"
    } ,
    {
    ...
    }
]

Aggiungiamo altro codice per processare i risultati di find(); utilizzeremo il metodo Map.forEach():

  Db db = new Db("mongodb://127.0.0.1/miodb");
  db.open().then((_){
    print("Connessione stabilita");

    DbCollection collezione;
    collezione = db.collection("utenti");
    collezione.find().toList().then((List risultati){

      print("Campo\tValore\n");
      for (Map risultato in risultati){
        risultato.forEach((campo,valore){
          print("$campo\t$valore");
        });
        print("");
      }

      db.close();
      print("Connessione chiusa.");
    });

  });

Output:

Connessione stabilita
Campo   Valore

_id     ObjectId(51435523ca4d1fa039bfcd13)
id      1
nome    John Doe
email   info@jdoe.com

_id     ObjectId(51435524ca4d1fa039bfcd14)
id      2
nome    Adrian Leverkuhun
email   a.leverkuhun@email.com

_id     ObjectId(51435524ca4d1fa039bfcd15)
id      3
nome    Duncan Ewart
email   duncan@welsh.com

_id     ObjectId(51435527ca4d1fa039bfcd16)
id      4
nome    Raimond Gregorius
email   gregorius@coimbra.pt

Connessione chiusa.

Concludiamo l’articolo di oggi modificando l’applicazione presentata la settimana scorsa sostituendo l’interazione con MySQL in una interazione con mongoDB. Modifichiamo innanzitutto la configurazione della connessione e le intestazioni della tabella che popoleremo con i valori del database:

String host = 'localhost';
String database = 'test';
String collezione = 'utenti';

String html_template;
String tbody = "";
String thead = """
    <tr>
      <th scope="col">ID</th>
      <th scope="col">NOME</th>
      <th scope="col">EMAIL</th>
    </tr>""";

Modifichiamo anche il corpo di main():

void main() {

  Db db = new Db("mongodb://$host/$database");
  db.open()
  .then((e){
    db.collection(collezione).find().toList()
    .then((risultati){
      for(var i=0; i<risultati.length;i++){
        tbody=tbody.concat("      <tr>\n");
        tbody = tbody.concat("        <td>${risultati[i]["id"]}</td>\n");
        tbody = tbody.concat("        <td>${risultati[i]["nome"]}</td>\n");
        tbody = tbody.concat("        <td>${risultati[i]["email"]}</td>\n");
        tbody=tbody.concat("      </tr>\n");
      }
    })
    .then((_){
      generaHtml();
      db.close();
    });
  });
}

Avviando l’applicazione, questa genererà una pagina html alla posizione specificata, identica a quella dell’applicazione precedente.

Il codice sorgente utilizzato in questo tutorial è disponibile sull’account Engeene su GitHub.

Leave a Reply

Claudio d'Angelis Articolo scritto da

Programmatore e studente di Informatica, appassionato di musica, web e sistemi UNIX. Collabora con Googlab dall'Ottobre 2012.

Contatta l'autore

Previous post:

Next post: