SlideShare a Scribd company logo
1 of 21
Mallorca #MongoDB User Group
http://www.meetup.com/Mallorca-MongoDB-User-Group/
MongoDB y .NET
@emiliotorrens | www.emiliotorrens.com
Agenda
El Driver de C#
Usando el Driver de C#:
MongoClient
BsonDocument
Serialización
Query Builder
Update Builder
LINQ
Ejemplos:
Definir y trabajar con una clase
Búsquedas
Aggregation Framework
El Driver de C#
El driver de C# es uno de los drivers oficiales que están soportados por la gente de 10gen.
La versión actual, la 1.7, utiliza el Framework 3.5 y es totalmente compatible con Mono.
Es Open Source y esta alojado en GitHub:
https://github.com/mongodb/mongo-csharp-driver
Esta disponible como paquete de NuGet:
http://nuget.org/packages/mongocsharpdriver/
Hay un grupo de discusión especifico para este Driver:
https://groups.google.com/forum/?fromgroups#!forum/mongodb-csharp
Hay un proyecto en el JIRA de MongoDB para poner y hacer seguimiento de bugs/mejoras:
https://jira.mongodb.org/browse/CSHARP
Su documentación esta alojada en el sitio de MongoDB:
http://docs.mongodb.org/ecosystem/drivers/csharp/
Usando el Driver de C#
Al ser un lenguaje estático no podemos escribir Json o diccionarios como haríamos en ruby o python, para suplirlo el
Driver lleva un Objeto “BsonDocument” y una serie de “Builders”.
Para usar el Driver tan solo debemos descargar las dll del Driver (MongoDB.Bson.dll y MongoDB.Driver.dll) y
añadirlas como referencia a nuestro proyecto.
Como mínimo será necesario añadir estos 2 using:
using MongoDB.Bson;
using MongoDB.Driver;
Para usar los builders:
using MongoDB.Driver.Builders;
Para controlar la Serilización:
using MongoDB.Bson.Serialization.Attributes;
Para usar LINQ:
using MongoDB.Driver.Linq;
Usando el Driver de C#: MongoClient
MongoClient es la clase cliente, la que tendrá toda la configuración y desde la que accederemos al server, las bases
de datos y las colecciones.
Crear una instancia de la clase y acceder a los datos es tan fácil como:
var connectionString = "mongodb://db1.example.net,db2.example.net:2500/?replicaSet=test";
var client = new MongoClient(connectionString);
var server = client.GetServer();
var database = server.GetDatabase(“database_name");
var collection = database.GetCollection<MyClass>(“MyClassCollection");
Tiene una sobrecarga para pasarle la clase MongoClientSettings, yo creo que es mucho mas fácil usar la connection
string ya que le puedes pasar las mismas opciones que a la clase de settings.
Puedes ver aquí las opciones de la string de conexión:
http://docs.mongodb.org/manual/reference/connection-string/
Usando el Driver de C#: MongoCollection
MongoCollection es la clase de los datos, es la que usaremos para buscar y escribir en la base de datos
Para instanciarla:
var collection = database.GetCollection<MyClass>(“MyClassCollection");
De los métodos que contiene esta clase estos son los que usaremos para leer y escribir datos:
Insert, InsertBatch, Save, Update, Remove, FindAndModify, FindAndRemove, FindAll, Find, FindOne, FindOneById.
Tiene otros métodos en los que no entraremos en detalle como MapReduce, GeoSearch, Gestion de Indices,
Aggregation etc.
Puedes ver toda la documentación aquí:
http://api.mongodb.org/csharp/current/html/6d5bbe8e-46f4-087f-8e83-06297634ed40.htm
Usando el Driver de C#: BsonDocument
BsonDocument es el objeto que utilizaremos para escribir BSON en nuestro código, es un modelo de objetos en
memoria que representa un documento BSON.
Podemos usarlo para escribir y leer datos en la base de datos::
MongoCollection<BsonDocument> books = database.GetCollection<BsonDocument>("books");
BsonDocument book = new BsonDocument {
{ "author", "Ernest Hemingway" },
{ "title", "For Whom the Bell Tolls" }
};
books.Insert(book);
Aunque yo creo que es mejor usar nuestras clases:
MongoCollection<Book> books = database.GetCollection<Book>("books");
Book book = new Book {
Author = "Ernest Hemingway",
Title = "For Whom the Bell Tolls"
};
books.Insert(book);
Usando el Driver de C#: BsonDocument
Algunas veces será imprescindible usar BsonDocument, pero yo solo lo he tenido que usar obligatoriamente para las
operaciones del “Aggregation Framework”:
operations = new[]{
new BsonDocument {
{
"$group", new BsonDocument{ { "_id" , "$Name" } , {"Total" , new BsonDocument{ {"$sum","$Age"} } } }
}
}
};
result = collection.Aggregate(operations);
Al final veremos un ejemplo.
Usando el Driver de C#: Serialización
Esta es una parte muy importante del Driver ya MongoDB es una base de datos libre de esquema y es aquí donde
controlaremos el modelo de datos.
Por defecto el Driver hace un auto mapeo de nuestras clases a Documentos simplemente campo a campo, pero el
Driver nos da herramientas para controlarlo.
Hay dos maneras de hacerlo usando BsonClassMap.RegisterClassMap o usando Atributos e Interfaces, yo creo que
es mejor usar atributos e interfaces.
A continuación veremos los mas habituales, puedes ver todas las posibilidades aquí:
http://docs.mongodb.org/ecosystem/tutorial/serialize-documents-with-the-csharp-driver/
Usando el Driver de C#: Serialización
Cualquier propiedad que no sea de solo lectura de nuestra clase automáticamente será mapeada, pero podemos
usar BsonElement para:
• Cambiar el nombre con el que se guarda en el Documento.
• Forzar a que una propiedad de solo lectura se guarde.
• Especificar el orden de Serialización.
public class MyClass {
[BsonElement("sp", Order = 1)]
public string SomeProperty { get; set; }
}
BsonIgnore o BsonIgnoreIfNull sirven para hacer que el mapeo ignore una propiedad o la ignore solo cuando es null:
public class MyClass {
[BsonIgnore]
public string SomeProperty { get; set; }
}
Usando el Driver de C#: Serialización
BsonId sirve para indicar que campo será el _id del documento, además le podemos indicar como se generara ese
_id, el Driver lleva varios generadores incluidos, si no nos bastan, podemos escribir el nuestro:
public class MyClass {
[BsonId(IdGenerator = typeof(GuidGenerator))]
public Guid Id { get; set; }
}
De los generadores incluidos los que se usan habitualmente son:
• BsonObjectIdGenerator para BsonObjectId.
• GuidGenerator para Guid.
• ObjectIdGenerator para ObjectId.
• StringObjectIdGenerator para ObjectId como strings.
Aqui hay un ejemplo de uno propio donde el _id es long y tiene la posibilidad de que sea incremental:
https://github.com/emiliotorrens/MongoMapper.NET/blob/master/EtoolTech.MongoDB.Mapper/Core/MongoMapp
erIdGenerator.cs
Usando el Driver de C#: Serialización
BsonDefaultValue sirve para indicar el valor por defecto de una propiedad:
public class MyClass {
[BsonDefaultValue("abc")]
public string SomeProperty { get; set; }
}
Además podemos ignorar la propiedad si tiene el valor por defecto:
public class MyClass {
[BsonDefaultValue("abc")]
[BsonIgnoreIfDefault]
public string SomeProperty { get; set; }
}
Aunque no parezca útil ignorar si tiene valor por defecto eso nos permite ahorrar espacio en la base de datos.
Usando el Driver de C#: Serialización
Podemos escribir nuestro serializador y asignárselo a una propiedad con BsonSerializer :
public class MyClass {
public ObjectId Id { get; set; }
[BsonSerializer(typeof(MyCustomStringSerializer))]
public string X { get; set; }
}
Los DateTime se guardan en UTC podemos hacer que el serializador convierta a local cuando nos lo muestre y a UTC
cuando lo guarde con BsonDateTimeOptions:
public class MyClass {
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime AppointmentTime { get; set; }
}
Ademas con BsonDateTimeOptions podemos hacer que ignore la hora
public class MyClass {
[BsonDateTimeOptions(DateOnly = true)]
public DateTime DateOfBirth { get; set; }
}
Usando el Driver de C#: Serialización
Normalmente la Serialización no se preocupa si tienes campos de mas en la clase, simplemente quedan a null o en
su valor por defecto, si quieres que lance una excepción en el caso de que ese campo no este en el Documento
tienes que usar BsonRequired:
public class MyClass {
[BsonRequired]
public string X { get; set; }
}
Usando el Driver de C#: Serialización
Tenemos disponibles opciones de Serialización a nivel de clase e incluso podemos escribir nuestro propio
serializador, cosa que no recomiendo, el del Driver va bien y es rápido, no hay que reinventar.
Podemos controlar que hacer con los elementos extras, campos que están en los documentos y no están en la clase,
podemos ignorarlos con BsonIgnoreExtraElements:
[BsonIgnoreExtraElements]
public MyClass {
}
Tambien podemos definir una propiedad con el atributo BsonExtraElements para que nos deje alli todos los campos
extras:
public MyClass {
[BsonExtraElements]
public IDictionary<string, object> CatchAll { get; set; }
}
Además podemos poner código pre y post Serialización en la clase ya que el driver soporta ISupportInitialize:
https://jira.mongodb.org/browse/CSHARP-387
Usando el Driver de C#: Query Builder
Este builder es el que usaremos para construir las sentencias de búsqueda de datos, soporta todos los operadores
de búsqueda de MongoDB GT, GTE, In, LT, LTE, Near, NE, And, Or ..
Utilizar el builder es realmente sencillo:
var persons = collection.Find(Query<Person>.EQ(p=>p.Age, 25));
Podemos ir anidando los operadores e indicar el orden del resultado:
var persons = collection.Find(Query.And(Query.Or(Query.EQ("Age", 25),
Query.EQ("Age", 26)),Query.Matches("Name",new BsonRegularExpression("Juan")))).SetSortOrder("Age");
La respuesta es un cursor al que le podemos indicar que campos queremos traer, skip, limit … :
var persons = collection.Find(Query.EQ("Childs.Age", 5)).SetFields(“Name").SetSkip(1).SetLimit(1);
Aquí podéis encontrar una referencia de selects SQL a Querys MongoDB:
http://docs.mongodb.org/manual/reference/sql-comparison/#select
Y aquí algunos ejemplos:
https://github.com/emiliotorrens/mongodb-drivers-samples/blob/master/csharp/mongodb-samples/Querying.cs
Usando el Driver de C#: Update Builder
Este builder es el que usaremos para construir las sentencias para modificar datos en la “parte del servidor” es decir,
sin mandar todo el Documento de nuevo, o para modificaciones a mas de un Documento.
Soporta todos los operadores de MongoDB:
http://docs.mongodb.org/manual/applications/update/#update-operators
La respuesta de las operaciones de escritura es la clase WriteConcernResult, contiene los resultados, documentos
afectados, errores etc.
La sintaxis es muy sencilla, es pasar el filtro de documentos a modificar, la operación y las opciones:
var result = collection.Update(Query.EQ("_id", Id), Update<Person>.Set(x=>x.Name, "Name2").Inc(x=>x.Age, 1));
if (result.HasLastErrorMessage) throw new Exception(result.ErrorMessage);
var result = collection.Update(Query.EQ("Age",45), Update.PushWrapped("Childs", new Child { Name = "child 3",
Age = 3 }), UpdateFlags.Multi);
Aquí podéis encontrar una referencia de updates SQL a Querys MongoDB:
http://docs.mongodb.org/manual/reference/sql-comparison/#update-records
Usando el Driver de C#: LINQ
El Driver tiene soporte para linq simplemente llamando al método AsQueryable de la colección podremos hacer
consultas linq:
Agregamos el using:
using MongoDB.Driver.Linq;
Y hacemos las consultas;
var query =
from p in collection.AsQueryable<Person>()
where p.Age == 36
select p;
foreach (var person in query)
{}
Aquí puedes ver la lista de las operaciones soportadas:
http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/
Usando el Driver de C#: Ejemplos
Definir y trabajar con una clase
https://github.com/emiliotorrens/mongodb-drivers-samples/blob/master/csharp/mongodb-samples/Person.cs
https://github.com/emiliotorrens/mongodb-drivers-samples/blob/master/csharp/mongodb-samples/Simple.cs
Búsquedas
https://github.com/emiliotorrens/mongodb-drivers-samples/blob/master/csharp/mongodb-samples/Querying.cs
Aggregation Framework
https://github.com/emiliotorrens/mongodb-drivers-samples/blob/master/csharp/mongodb-samples/Aggregation.cs
Próximos Meetups
• Poner MongoDB en Producción
• Objects Mappings para MongoDB
• MongoDB y Ruby on Rails
Mallorca #MongoDB User Group
http://www.meetup.com/Mallorca-MongoDB-User-Group/
Gracias por venir ;)
@emiliotorrens | www.emiliotorrens.com

More Related Content

What's hot

What's hot (7)

Javascript Básico
Javascript BásicoJavascript Básico
Javascript Básico
 
Curso Jsp Mas
Curso Jsp MasCurso Jsp Mas
Curso Jsp Mas
 
05 jsp tags
05 jsp tags05 jsp tags
05 jsp tags
 
jQuery Mobile :: Cuadros de diálogo
jQuery Mobile :: Cuadros de diálogojQuery Mobile :: Cuadros de diálogo
jQuery Mobile :: Cuadros de diálogo
 
Jsp
JspJsp
Jsp
 
Servlets y jsp
Servlets y jspServlets y jsp
Servlets y jsp
 
Acciones JSP
Acciones JSPAcciones JSP
Acciones JSP
 

Similar to Mallorca MUG: MongoDB y .NET

Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......SaulSalinasNeri
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii1 2d
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSIan Monge Pérez
 
Notas clase
Notas claseNotas clase
Notas clase1 2d
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii1 2d
 
Notas clase
Notas claseNotas clase
Notas clase1 2d
 
Primeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPrimeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPablo Aguilera
 
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendmenttes
 
Guia bootstrap
Guia bootstrapGuia bootstrap
Guia bootstrapljds
 
Jyoc java-cap16 persistencia. bases de datos
Jyoc java-cap16 persistencia. bases de datosJyoc java-cap16 persistencia. bases de datos
Jyoc java-cap16 persistencia. bases de datosJyoc X
 
Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsFreelancer
 
[ES] Conectividad de java a base de datos(jdbc)
[ES] Conectividad de java a base  de datos(jdbc)[ES] Conectividad de java a base  de datos(jdbc)
[ES] Conectividad de java a base de datos(jdbc)Eudris Cabrera
 
Org tutorial struts_2010
Org tutorial struts_2010Org tutorial struts_2010
Org tutorial struts_2010Omar Rios
 

Similar to Mallorca MUG: MongoDB y .NET (20)

Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......
 
Semana 2 Configuración entorno de desarrollo
Semana 2   Configuración entorno de desarrolloSemana 2   Configuración entorno de desarrollo
Semana 2 Configuración entorno de desarrollo
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JS
 
Notas clase
Notas claseNotas clase
Notas clase
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Notas clase
Notas claseNotas clase
Notas clase
 
Primeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier AznarPrimeros pasos con Backbone js, por Xavier Aznar
Primeros pasos con Backbone js, por Xavier Aznar
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
 
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
 
2_4_Los_metadatos_El_elemento_head.pdf
2_4_Los_metadatos_El_elemento_head.pdf2_4_Los_metadatos_El_elemento_head.pdf
2_4_Los_metadatos_El_elemento_head.pdf
 
Guia bootstrap
Guia bootstrapGuia bootstrap
Guia bootstrap
 
Jyoc java-cap16 persistencia. bases de datos
Jyoc java-cap16 persistencia. bases de datosJyoc java-cap16 persistencia. bases de datos
Jyoc java-cap16 persistencia. bases de datos
 
Dar lab1819
Dar lab1819Dar lab1819
Dar lab1819
 
Guia herramientas de bd
Guia herramientas de bdGuia herramientas de bd
Guia herramientas de bd
 
Desarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on RailsDesarrollo de Apps Web en Ruby on Rails
Desarrollo de Apps Web en Ruby on Rails
 
Guía herramientas de BD PHP
Guía herramientas de BD PHPGuía herramientas de BD PHP
Guía herramientas de BD PHP
 
Taller de Grails
Taller de GrailsTaller de Grails
Taller de Grails
 
[ES] Conectividad de java a base de datos(jdbc)
[ES] Conectividad de java a base  de datos(jdbc)[ES] Conectividad de java a base  de datos(jdbc)
[ES] Conectividad de java a base de datos(jdbc)
 
Org tutorial struts_2010
Org tutorial struts_2010Org tutorial struts_2010
Org tutorial struts_2010
 

Recently uploaded

POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 

Recently uploaded (10)

POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 

Mallorca MUG: MongoDB y .NET

  • 1. Mallorca #MongoDB User Group http://www.meetup.com/Mallorca-MongoDB-User-Group/ MongoDB y .NET @emiliotorrens | www.emiliotorrens.com
  • 2. Agenda El Driver de C# Usando el Driver de C#: MongoClient BsonDocument Serialización Query Builder Update Builder LINQ Ejemplos: Definir y trabajar con una clase Búsquedas Aggregation Framework
  • 3. El Driver de C# El driver de C# es uno de los drivers oficiales que están soportados por la gente de 10gen. La versión actual, la 1.7, utiliza el Framework 3.5 y es totalmente compatible con Mono. Es Open Source y esta alojado en GitHub: https://github.com/mongodb/mongo-csharp-driver Esta disponible como paquete de NuGet: http://nuget.org/packages/mongocsharpdriver/ Hay un grupo de discusión especifico para este Driver: https://groups.google.com/forum/?fromgroups#!forum/mongodb-csharp Hay un proyecto en el JIRA de MongoDB para poner y hacer seguimiento de bugs/mejoras: https://jira.mongodb.org/browse/CSHARP Su documentación esta alojada en el sitio de MongoDB: http://docs.mongodb.org/ecosystem/drivers/csharp/
  • 4. Usando el Driver de C# Al ser un lenguaje estático no podemos escribir Json o diccionarios como haríamos en ruby o python, para suplirlo el Driver lleva un Objeto “BsonDocument” y una serie de “Builders”. Para usar el Driver tan solo debemos descargar las dll del Driver (MongoDB.Bson.dll y MongoDB.Driver.dll) y añadirlas como referencia a nuestro proyecto. Como mínimo será necesario añadir estos 2 using: using MongoDB.Bson; using MongoDB.Driver; Para usar los builders: using MongoDB.Driver.Builders; Para controlar la Serilización: using MongoDB.Bson.Serialization.Attributes; Para usar LINQ: using MongoDB.Driver.Linq;
  • 5. Usando el Driver de C#: MongoClient MongoClient es la clase cliente, la que tendrá toda la configuración y desde la que accederemos al server, las bases de datos y las colecciones. Crear una instancia de la clase y acceder a los datos es tan fácil como: var connectionString = "mongodb://db1.example.net,db2.example.net:2500/?replicaSet=test"; var client = new MongoClient(connectionString); var server = client.GetServer(); var database = server.GetDatabase(“database_name"); var collection = database.GetCollection<MyClass>(“MyClassCollection"); Tiene una sobrecarga para pasarle la clase MongoClientSettings, yo creo que es mucho mas fácil usar la connection string ya que le puedes pasar las mismas opciones que a la clase de settings. Puedes ver aquí las opciones de la string de conexión: http://docs.mongodb.org/manual/reference/connection-string/
  • 6. Usando el Driver de C#: MongoCollection MongoCollection es la clase de los datos, es la que usaremos para buscar y escribir en la base de datos Para instanciarla: var collection = database.GetCollection<MyClass>(“MyClassCollection"); De los métodos que contiene esta clase estos son los que usaremos para leer y escribir datos: Insert, InsertBatch, Save, Update, Remove, FindAndModify, FindAndRemove, FindAll, Find, FindOne, FindOneById. Tiene otros métodos en los que no entraremos en detalle como MapReduce, GeoSearch, Gestion de Indices, Aggregation etc. Puedes ver toda la documentación aquí: http://api.mongodb.org/csharp/current/html/6d5bbe8e-46f4-087f-8e83-06297634ed40.htm
  • 7. Usando el Driver de C#: BsonDocument BsonDocument es el objeto que utilizaremos para escribir BSON en nuestro código, es un modelo de objetos en memoria que representa un documento BSON. Podemos usarlo para escribir y leer datos en la base de datos:: MongoCollection<BsonDocument> books = database.GetCollection<BsonDocument>("books"); BsonDocument book = new BsonDocument { { "author", "Ernest Hemingway" }, { "title", "For Whom the Bell Tolls" } }; books.Insert(book); Aunque yo creo que es mejor usar nuestras clases: MongoCollection<Book> books = database.GetCollection<Book>("books"); Book book = new Book { Author = "Ernest Hemingway", Title = "For Whom the Bell Tolls" }; books.Insert(book);
  • 8. Usando el Driver de C#: BsonDocument Algunas veces será imprescindible usar BsonDocument, pero yo solo lo he tenido que usar obligatoriamente para las operaciones del “Aggregation Framework”: operations = new[]{ new BsonDocument { { "$group", new BsonDocument{ { "_id" , "$Name" } , {"Total" , new BsonDocument{ {"$sum","$Age"} } } } } } }; result = collection.Aggregate(operations); Al final veremos un ejemplo.
  • 9. Usando el Driver de C#: Serialización Esta es una parte muy importante del Driver ya MongoDB es una base de datos libre de esquema y es aquí donde controlaremos el modelo de datos. Por defecto el Driver hace un auto mapeo de nuestras clases a Documentos simplemente campo a campo, pero el Driver nos da herramientas para controlarlo. Hay dos maneras de hacerlo usando BsonClassMap.RegisterClassMap o usando Atributos e Interfaces, yo creo que es mejor usar atributos e interfaces. A continuación veremos los mas habituales, puedes ver todas las posibilidades aquí: http://docs.mongodb.org/ecosystem/tutorial/serialize-documents-with-the-csharp-driver/
  • 10. Usando el Driver de C#: Serialización Cualquier propiedad que no sea de solo lectura de nuestra clase automáticamente será mapeada, pero podemos usar BsonElement para: • Cambiar el nombre con el que se guarda en el Documento. • Forzar a que una propiedad de solo lectura se guarde. • Especificar el orden de Serialización. public class MyClass { [BsonElement("sp", Order = 1)] public string SomeProperty { get; set; } } BsonIgnore o BsonIgnoreIfNull sirven para hacer que el mapeo ignore una propiedad o la ignore solo cuando es null: public class MyClass { [BsonIgnore] public string SomeProperty { get; set; } }
  • 11. Usando el Driver de C#: Serialización BsonId sirve para indicar que campo será el _id del documento, además le podemos indicar como se generara ese _id, el Driver lleva varios generadores incluidos, si no nos bastan, podemos escribir el nuestro: public class MyClass { [BsonId(IdGenerator = typeof(GuidGenerator))] public Guid Id { get; set; } } De los generadores incluidos los que se usan habitualmente son: • BsonObjectIdGenerator para BsonObjectId. • GuidGenerator para Guid. • ObjectIdGenerator para ObjectId. • StringObjectIdGenerator para ObjectId como strings. Aqui hay un ejemplo de uno propio donde el _id es long y tiene la posibilidad de que sea incremental: https://github.com/emiliotorrens/MongoMapper.NET/blob/master/EtoolTech.MongoDB.Mapper/Core/MongoMapp erIdGenerator.cs
  • 12. Usando el Driver de C#: Serialización BsonDefaultValue sirve para indicar el valor por defecto de una propiedad: public class MyClass { [BsonDefaultValue("abc")] public string SomeProperty { get; set; } } Además podemos ignorar la propiedad si tiene el valor por defecto: public class MyClass { [BsonDefaultValue("abc")] [BsonIgnoreIfDefault] public string SomeProperty { get; set; } } Aunque no parezca útil ignorar si tiene valor por defecto eso nos permite ahorrar espacio en la base de datos.
  • 13. Usando el Driver de C#: Serialización Podemos escribir nuestro serializador y asignárselo a una propiedad con BsonSerializer : public class MyClass { public ObjectId Id { get; set; } [BsonSerializer(typeof(MyCustomStringSerializer))] public string X { get; set; } } Los DateTime se guardan en UTC podemos hacer que el serializador convierta a local cuando nos lo muestre y a UTC cuando lo guarde con BsonDateTimeOptions: public class MyClass { [BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime AppointmentTime { get; set; } } Ademas con BsonDateTimeOptions podemos hacer que ignore la hora public class MyClass { [BsonDateTimeOptions(DateOnly = true)] public DateTime DateOfBirth { get; set; } }
  • 14. Usando el Driver de C#: Serialización Normalmente la Serialización no se preocupa si tienes campos de mas en la clase, simplemente quedan a null o en su valor por defecto, si quieres que lance una excepción en el caso de que ese campo no este en el Documento tienes que usar BsonRequired: public class MyClass { [BsonRequired] public string X { get; set; } }
  • 15. Usando el Driver de C#: Serialización Tenemos disponibles opciones de Serialización a nivel de clase e incluso podemos escribir nuestro propio serializador, cosa que no recomiendo, el del Driver va bien y es rápido, no hay que reinventar. Podemos controlar que hacer con los elementos extras, campos que están en los documentos y no están en la clase, podemos ignorarlos con BsonIgnoreExtraElements: [BsonIgnoreExtraElements] public MyClass { } Tambien podemos definir una propiedad con el atributo BsonExtraElements para que nos deje alli todos los campos extras: public MyClass { [BsonExtraElements] public IDictionary<string, object> CatchAll { get; set; } } Además podemos poner código pre y post Serialización en la clase ya que el driver soporta ISupportInitialize: https://jira.mongodb.org/browse/CSHARP-387
  • 16. Usando el Driver de C#: Query Builder Este builder es el que usaremos para construir las sentencias de búsqueda de datos, soporta todos los operadores de búsqueda de MongoDB GT, GTE, In, LT, LTE, Near, NE, And, Or .. Utilizar el builder es realmente sencillo: var persons = collection.Find(Query<Person>.EQ(p=>p.Age, 25)); Podemos ir anidando los operadores e indicar el orden del resultado: var persons = collection.Find(Query.And(Query.Or(Query.EQ("Age", 25), Query.EQ("Age", 26)),Query.Matches("Name",new BsonRegularExpression("Juan")))).SetSortOrder("Age"); La respuesta es un cursor al que le podemos indicar que campos queremos traer, skip, limit … : var persons = collection.Find(Query.EQ("Childs.Age", 5)).SetFields(“Name").SetSkip(1).SetLimit(1); Aquí podéis encontrar una referencia de selects SQL a Querys MongoDB: http://docs.mongodb.org/manual/reference/sql-comparison/#select Y aquí algunos ejemplos: https://github.com/emiliotorrens/mongodb-drivers-samples/blob/master/csharp/mongodb-samples/Querying.cs
  • 17. Usando el Driver de C#: Update Builder Este builder es el que usaremos para construir las sentencias para modificar datos en la “parte del servidor” es decir, sin mandar todo el Documento de nuevo, o para modificaciones a mas de un Documento. Soporta todos los operadores de MongoDB: http://docs.mongodb.org/manual/applications/update/#update-operators La respuesta de las operaciones de escritura es la clase WriteConcernResult, contiene los resultados, documentos afectados, errores etc. La sintaxis es muy sencilla, es pasar el filtro de documentos a modificar, la operación y las opciones: var result = collection.Update(Query.EQ("_id", Id), Update<Person>.Set(x=>x.Name, "Name2").Inc(x=>x.Age, 1)); if (result.HasLastErrorMessage) throw new Exception(result.ErrorMessage); var result = collection.Update(Query.EQ("Age",45), Update.PushWrapped("Childs", new Child { Name = "child 3", Age = 3 }), UpdateFlags.Multi); Aquí podéis encontrar una referencia de updates SQL a Querys MongoDB: http://docs.mongodb.org/manual/reference/sql-comparison/#update-records
  • 18. Usando el Driver de C#: LINQ El Driver tiene soporte para linq simplemente llamando al método AsQueryable de la colección podremos hacer consultas linq: Agregamos el using: using MongoDB.Driver.Linq; Y hacemos las consultas; var query = from p in collection.AsQueryable<Person>() where p.Age == 36 select p; foreach (var person in query) {} Aquí puedes ver la lista de las operaciones soportadas: http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/
  • 19. Usando el Driver de C#: Ejemplos Definir y trabajar con una clase https://github.com/emiliotorrens/mongodb-drivers-samples/blob/master/csharp/mongodb-samples/Person.cs https://github.com/emiliotorrens/mongodb-drivers-samples/blob/master/csharp/mongodb-samples/Simple.cs Búsquedas https://github.com/emiliotorrens/mongodb-drivers-samples/blob/master/csharp/mongodb-samples/Querying.cs Aggregation Framework https://github.com/emiliotorrens/mongodb-drivers-samples/blob/master/csharp/mongodb-samples/Aggregation.cs
  • 20. Próximos Meetups • Poner MongoDB en Producción • Objects Mappings para MongoDB • MongoDB y Ruby on Rails
  • 21. Mallorca #MongoDB User Group http://www.meetup.com/Mallorca-MongoDB-User-Group/ Gracias por venir ;) @emiliotorrens | www.emiliotorrens.com