Esperimenti con MongoDb

Durante questo periodo di ferie ho potuto affrontare alcuni temi presenti nella mia personale lista dei “TO-DO”.

Il rumore intorno ai Database Documentali e al movimento #NoSQL sta crescendo grazie anche al fatto che grandi nomi (Facebook, Amazon, SourceForge e altri) li usano da tempo in produzione.

Cosi ho scaricato gli eseguibili di MongoDB e il relativo driver C# ed ho scritto un primo esempio di utilizzo.

Il server è un’applicazione console (che può essere installata come servizio) che rimane in ascolto su una certa porta (configurabile):

D:\mongodb-win32-x86_64-1.2.1\bin>mongod.exe --dbpath ./data
 
Tue Jan 05 19:16:20 Mongo DB : starting : pid = 0 port = 27017 dbpath = ./data master = 0 slave = 0  64-bit
Tue Jan 05 19:16:20 db version v1.2.1, pdfile version 4.5
Tue Jan 05 19:16:20 git version: 45992de574979343f34fdfe96b069d5d1eff0182
Tue Jan 05 19:16:20 sys info: windows (6, 0, 6002, 2, 'Service Pack 2') BOOST_LIB_VERSION=1_39
Tue Jan 05 19:16:20 waiting for connections on port 27017

Cosi il server è avviato e in ascolto per eventuali comandi. Non ho creato nessun database per ora.

Da visual studio ho creato un mini progetto per fare alcuni esperimenti:

Mongo mongo = new Mongo();
mongo.Connect();
Database db = mongo.getDB("MyTestDb");
IMongoCollection posts = db.GetCollection("Persons");
 
Document doc = new Document();
doc["Name"] = "Emanele";
doc["Surname"] = "DelBono";
posts.Insert(doc);
 
Document example = new Document();
example["Name"] = "Emanuele";
ICursor cursor = posts.Find(example);
foreach (Document document in cursor.Documents)
{
  Console.WriteLine(document.ToString());
}

Nel primo blocco creo un database “MyDbTest” e seleziono la collection su cui lavorare (“Persons”).

Poi creo un nuovo documento. La classe Document, messa a disposizione dal driver C#, rappresenta un “chunk” di informazione da salvare nel database. Alla base è un Dictionary in cui key, value raprresentano nome della proprietà e valore ma può contenere qualsiasi tipo di gerarchia complessa. Internamente i dati sono memorizzati in JSON (come molti database documentali).

Il documento creato viene salvato nel database usando l’istruzione insert.

Nell’ultimo blocco vado a recuperare l’informazione. Nello specifico costruisco un documento che fa da “esempio” per la ricerca e il metodo Find estrae tutti i documenti che hanno la chiave Name = “Emanuele”.

Insomma, il succo della semplicità, più di cosi non si può pretendere. Le performance sembrano buone, ci sono altri metodi per estrapolare le informazioni in modo più mirato, supporta lo storage per grossi documenti (video, foto, ecc…).

Sicuramente bisogna lavorarci un po’ per capirne i limiti e apprezzarne ancora di più i pregi, ma l’inizio è fantastico (e sta, ripeto, nella semplicità) e in applicazioni non troppo complesse dal punto di vista dei dati sembra essere l’ottimo: pensate ad un blog engine in cui potete salvare un intero post (con testo, foto, commenti, tags, ecc…) con una semplice insert di un Documento.

Sul sito di MongoDB trovate molta documentazione.

Nel frattempo i miei esperimenti continueranno (spero). Sto provando a scrivere un mapper che permette di trasformare oggetti di dominio in Document cosi da evitare il mapping manuale. Dovrebbe essere abbastanza semplice prendendo spunto dai vari serializzatori e deserializzatori JSON.

Print | posted on Wednesday, January 6, 2010 11:57 AM