venerdì 15 luglio 2016

MongoDB & Delphi

In questo articolo vedremo come utilizzare MongoDB con Delphi.

Questa non vuole essere una guida dettagliata a MongoDB, potete trovare ovunque una marea di informazioni, partendo ad esempio dal sito ufficiale: https://docs.mongodb.com/


Cos'è MongoDB

è un database nosql, orientato al documento, per fare un paragone con un database relazionale:

RELAZIONALE (Oracle, Firebird, ...)
MongoDB
TABELLA
Collection
RECORD
Document
COLONNA
Field
SELECT * FROM ANAGRAFICA
db.anagrafica.find()
INSERT INTO ANAGRAFICA
db.anagrafica.insert({}}


I punti di forza di MongoDB e i motivi principali per cui utilizzarlo sono:

  • Scalabilità
  • Performance
  • Alta affidabilità, grazie ai replica set
  • Flessibilità, non esiste il concetto di schema di una tabella, ogni documento di una collection può essere diverso dall'altro

Personalmente ho trovato vincente un approccio misto, utilizzando molte tabelle di un classico database relazionale e solo poche collection in un db nosql, dove sono contenuti dati dernomalizzati per un accesso rapido alle informazioni.

MongoDB utilizza il formato JSON per la visualizzazione dei dati e il linguaggio JavaScript, è quindi vivamente consigliato conoscere entrambi.

Esempio di documento in JSON:

{
       "nome": "Luca",
       "indirizzo": "Via del Popolo 20",
       "figli": [
             { "nome": "Annamaria", "eta": 3 },
             { "nome": "Luigi", "eta": 2 }
       ]
}


Installazione
(Windows)



dal prompt del dos, eseguire:

mongod


per poter accedere alla console interattiva, da cui è possibile fare operazioni CRUD, aprire un altro prompt del dos e digitare:

mongo

use anagrafica


// Create:
db.anagrafica.insert({
    "nome": "Mario",
    "indirizzo": "Via Veneto 10",
    "hobby": "Calcio"
})

// Read:
db.anagrafica.find()

// Per visualizzare meglio il risultato:
db.anagrafica.find().pretty()

// Update:
db.anagrafica.update({}, {
     $set: {"nome": "Luigi"}
})

// Delete: (all)
db.anagrafica.drop()


Alcune considerazioni:
  • Il comando use <nome-database> permette di passare al db in questione o a crearne uno nuovo se non esiste
  • Ogni comando CRUD inizia con "db."
  • Il comando insert su una collection che ancora non esiste (ad esempio db.anagrafica.insert({})) crea prima automaticamente la collection
  • Le operazioni di default che compongono i comandi iniziano con il simbolo di $
  • Il comando update, esegue l' update del primo record trovato


Delphi

Per l'utilizzo con Delphi esistono diverse soluzioni:

In questo articolo utilizzerò i componenti FireDAC con Delphi 10.1 Berlin.

Ho creato un semplice progetto demo CRUD:




















In particolare per la lettura dei dati utilizzo il componente visuale:
FDMongoQuery
utilizzandolo come un DataSet standard:


while not FDMongoQuery.Eof do
begin
  LogMessage('Record: ' + FDMongoQuery.FieldByName('name').AsString);
  FDMongoQuery.Next;
end;


Per l'inserimento dei dati utilizzo questi oggetti (non visuali):
TMongoConnection, TMongoDocument, TMongoEnv

che utilizzano un approccio fluent per la creazione del documento MongoDB:

    MongoDoc := MongoEnv.NewDoc;
    try
      MongoDoc
        .Add('name', 'Name ' + IntToStr(i) + ' - Record ' + IntToStr(i))
        .Add('age', IntToStr(i));
      MongConn[DB_NAME][COLLECTION_NAME].Insert(MongoDoc);
    finally
      MongoDoc.Free;
    end;


Per ulteriori approfondimenti vi consiglio di vedere questo video:
https://www.youtube.com/watch?v=_YxKUFSyV7U

Il codice sorgente si trova qui:

In particolare il file principale è questo: