SharpMongo (2) Un REPL

Anterior Post

Sigo trabajando en mi proyecto de almacén de documentos en memoria, en proceso, escrito en C#

https://github.com/ajlopez/SharpMongo

Intenta implementar las operaciones de MongoDB: tener document bases, collections, documents, objetos dinámicos, etc. Pero con la diferencia: todo en memoria, en el mismo proceso. La persistencia a disco será una especie de plugin.

Una de las herramientas que quería tener es un REPL (Read Eval Print Loop), un programa de consola que emulara las principales funciones del programa MongoDB cliente consola original (ese cliente se conecta con un servidor; en el caso actual, SharpMongo funciona directamente en el mismo proceso, y en la misma memoria del programa de consola)

El proyecto es SharpMongo.Console, y produce un assembly sharpmongo.exe. Lanzándolo desde una línea de comando, comienza a ejecutar lo que le ingresemos por línea en el prompt:

SharpMongo 0.0.1
> show dbs
> show collections
> use foo
> show dbs
foo  


Ahora estamos en una db (document base) llamada ‘foo’. Podemos directamente crear una collection insertando documentos dinámicos (en un formato tipo JSON):



> db.people.insert({ Name: 'Adam', Age: 800 })
> db.people.insert({ Name: 'Eve', Age: 700 })
> show collections
people  


Podemos buscar todos los elementos de la collection:



  > db.people.find()
{ "Name": "Adam", "Age": 800, "Id": 4d802e11-a038-468e-bd26-38e96ad6f7d8 }
{ "Name": "Eve", "Age": 700, "Id": b29917f1-70f1-4f6c-95bb-f789fa9bf3c0 }  


O podemos buscar los que cumplan con un criterio, expresado en un objeto dinámico query (tipo query by example):



  > db.people.find({ Name: 'Adam' })
{ "Name": "Adam", "Age": 800, "Id": 4d802e11-a038-468e-bd26-38e96ad6f7d8 }  


Podemos seguir insertando documentos y ver el resultado



> db.people.insert({ Name: 'Cain', Age: 600 })
> db.people.insert({ Name: 'Abel', Age: 500 })
> db.people.find()
{ "Name": "Adam", "Age": 800, "Id": 4d802e11-a038-468e-bd26-38e96ad6f7d8 }
{ "Name": "Eve", "Age": 700, "Id": b29917f1-70f1-4f6c-95bb-f789fa9bf3c0 }
{ "Name": "Cain", "Age": 600, "Id": a5a3e1af-7e5c-4c16-829e-c07f94bc8697 }
{ "Name": "Abel", "Age": 500, "Id": c1da0055-8ded-4540-876f-5c032f514ed3 }  


Podemos insertar y remover



> db.people.insert({ Name: 'Pluto' })
> db.people.find()
{ "Name": "Adam", "Age": 800, "Id": 4d802e11-a038-468e-bd26-38e96ad6f7d8 }
{ "Name": "Eve", "Age": 700, "Id": b29917f1-70f1-4f6c-95bb-f789fa9bf3c0 }
{ "Name": "Cain", "Age": 600, "Id": a5a3e1af-7e5c-4c16-829e-c07f94bc8697 }
{ "Name": "Abel", "Age": 500, "Id": c1da0055-8ded-4540-876f-5c032f514ed3 }
{ "Name": "Pluto", "Id": 0561864a-470a-4437-9467-773ffb5a438a }
> db.people.remove({ Name: 'Pluto' })
> db.people.find()
{ "Name": "Adam", "Age": 800, "Id": 4d802e11-a038-468e-bd26-38e96ad6f7d8 }
{ "Name": "Eve", "Age": 700, "Id": b29917f1-70f1-4f6c-95bb-f789fa9bf3c0 }
{ "Name": "Cain", "Age": 600, "Id": a5a3e1af-7e5c-4c16-829e-c07f94bc8697 }
{ "Name": "Abel", "Age": 500, "Id": c1da0055-8ded-4540-876f-5c032f514ed3 }   


Hay varias cosas que faltan, del MongoDB original, la más importante debe ser el soporte de operadores en los objetos query, que permiten buscar por otros criterios más allá de la igualdad por campo, y operadores en los objetos update. Pero todo vendrá, como siempre, usando TDD



Nos leemos!



Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez

This entry was posted in 1389, 15035, 17526, 18097, 5374. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>