Si algo tiene MongoDB, es que tiene una enorme cantidad de clientes para acceder a la base de datos. Hay clientes para Java, para Node.js, para PHP, para Ruby y cómo no, también hay un cliente para C#.
Servicio de acceso a datos
En esta primera entrega, lo primero que vamos a crear en nuestra API será una capa de acceso a datos. Para ello, lo primero que deberemos hacer es instalar el driver de MongoDB para .NET. Podemos hacerlo desde la consola de NuGet con el comando Install-Package mongocsharpdriver o desde el administrador gráfico de paquetes de Visual Studio.
Una vez instalado, podremos hacer uso en nuestro proyecto de las clases de MongoDB. Nuestra clase de acceso a datos estará en el namespace Services, y la llamaremos MongoDataService. Veamos su código.
public class MongoDataService
{
private MongoServer server;
private string database { get; set; }
public MongoDataService(string connectionString)
{
MongoClient client = new MongoClient(connectionString);
server = client.GetServer();
}
public string findOne(string databaseName, string collectionName, string query)
{
var db = server.GetDatabase(databaseName);
var collection = db.GetCollection(collectionName);
BsonDocument bsonDoc = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(query);
var result = collection.FindOne(new QueryDocument(bsonDoc));
if (result!=null)
{
return result.ToJson();
} else {
return "";
}
}
}
En el constructor de la clase MongoDataService lo primero que hacemos es instanciar un objeto MongoClient pasándole como parámetro la cadena de conexión a la base de datos. Esta cadena de conexión, será del tipo “mongodb://localhost:27666” que es la ruta en la que está corriendo nuestra base de datos MongoDB.
La clase solo tiene un método público llamado findOne, que será el encargado de devolver un documento como resultado de una búsqueda. Para ello utilizará los parámetros databaseName, que contiene el nombre de la base de datos a consultar; collectionName, que contiene el nombre de la colección que se va a consultar; y query, que contiene un documento JSON, con la consulta que se va a realizar.
Puesto que en el constructor de la clase ya hemos conectado con el servidor de MongoDB, después solo hay que recuperar un objeto MongoDatabase para realizar operaciones, sobre las colecciones de esa base de datos. Es importante destacar que MongoDatabase, MongoServer y MongoCollection, son objetos thread safe, por lo que no deberemos preocuparnos demasiado con la instanciación de los mismos.
La clase está programada con la intención de crear un objeto que nos permita realizar cualquier consulta que se nos ocurra. No obstante, como veremos más tarde esta aproximación nos puede causar en el futuro, por lo que habrá que refactorizarla en próximas entregas para mejorar nuestro código.
Llamada WebAPI
En esta primera versión del proyecto, vamos a crear un controlador llamado PeopleController que solamente tendrá un método Get. Veamos su código.
public class PeopleController : ApiController
{
// GET api/people/545a4r4555dfasd
public string Get(string _id)
{
var connection = WebConfigurationManager.ConnectionStrings[“MongoDB”].ToString();
MongoDataService dataService = new MongoDataService(connection);
return dataService.findOne(“test”, “people”, String.Format(“{ {_id: ObjectId("{0}") } }”, _id));
}
}
El método Get de nuestro controlador recibirá peticiones que incluyan un string con el campo _id que queremos encontrar. Cada vez que se realice una petición, extraeremos el valor de la cadena de conexión “MongoDB” de nuestro Webconfig y crearemos un nuevo objeto MongoDataService.
Utilizando dicho objeto, llamaremos al método findOne pasándo como parámetros el nombre de la base de datos “test”, la colección “people” y un string JSON con el _id que tenemos que buscar.
Por tanto si ejecutamos el código y hacemos una petición a la URL “http://localhost:54907/api/people/values?_id=5257e2e7834a87e7ea509655” desde el navegador, obtendremos algo similar a esto:
<string xmlns=“http://schemas.microsoft.com/2003/10/Serialization/”>
{
“_id”: ObjectId(“5257e2e7834a87e7ea509655”),
“isActive”: true,
“balance”: “$3,
673.00”,
“picture”: “http: //placehold.it/32x32”, “age” : 34,
“name”: “MccallBranch”,
“gender”: “male”,
“email”: “mccallbranch@tingles.com”,
“phone”: “+1(863)565 -3711”,
“address”: {
“primary”: “974LakePlace,
Terlingua,
Kentucky,
6387”,
“secondary”: “709HalleckStreet,
Watrous,
NewMexico,
1907”
},
“about”: “Ullamcononexerci”,
“registered”: “1993-05-31T04: 37: 29 -0 2: 0 0”,
“latitude”: -78.623164,
“longitude”: 60.535922,
“tags”: [
“qui”,
“consectetur”,
“Lorem”,
“sint”,
“occaecat”,
“ullamco”,
“dolore”
],
“friends”: [
{
“id”: 0,
“name”: “GuzmanGiles”
},
{
“id”: 1,
“name”: “BrandiKane”
},
{
“id”: 2,
“name”: “DicksonRoman”
}
],
“randomArrayItem”: “apple”
}
</string>
Conclusiones
Como podéis ver realizar consultas contra MongoDB, desde C# es bastante sencillo. Tan solo tenemos que tener en cuenta que hay que crear un objeto MongoServer, que utilizaremos primero para acceder a la base de datos, y luego a la colección que queramos consultar.
Aunque aquí hemos visto solo una manera de realizar la consulta, existen otras, como son utilizar el objeto Query o directamenteLinQ.
Pero el código tiene varios problemas. Por ejemplo, es muy difícil realizar test unitarios, ya que el acoplamiento de nuestro controlador con la clase MongoDataService es bastante alto. En esta primera versión, solo tenemos un método en la API, pero cuando añadamos más, el acomplamiento empezará a ser un problema más grave.
Veremos como solucionar esto en futuras entregas.
Recuerda que puedes ver el índice del tutorial y acceder a todos los artículos de la serie desde aquí.
¿Quiéres que te avisemos cuando se publiquen nuevas entradas en el blog?
Suscríbete por correo electrónico o por RSS