Läs och skriv till MongoDB med C# driver

I vårt projekt med Fältrapportering med TC55 så har jag nått fram till att läsa våra undersökningar från, och skriva ner våra rapporter till, MongoDB. Det är detta som kallas CRUD, vilket är en förkortning för Create, Read, Update, Delete, det vill säga Skapa, Läsa, Uppdatera, Ta bort. Eftersom jag är en C#-utvecklare så använder jag MongoDB C# drivers.

Installera MongoDB C# driver

Ända sedan Visual Studio 2010 så ska din första instinkt för att hämta kodbibliotek vara att kolla NuGet. Det gäller givetvis i MongoDB C# driver-fallet också. Öppna NuGet och sök efter MongoDB. Bland de översta träffarna (den översta när denna blog skrivs) ska vara Official MongoDB C# driver och det är bara att klicka på installera så är allt redo.

MongoDB är väl indelat i många olika namespace:s så var beredd på du kommer behöva lägga till nya using för att intellisense:n ska fungera för mycket av det du kommer använda. De första intressanta objekten ligger i MongoDB.Driver så en using MongoDB.Driver; löser de omedelbara problemen.

Uppkoppling mot MongoDB

I vårt projekt har jag än så länge inte stött på något behov av att använda något annat än MongoDB standard, så även om uppkopplingen mot MongoDB har många avancerade inställningsmöjligheter så går jag inte in på de här.

Första steget är att skapa en MongoClient, som är objektet som hanterar uppkopplingen mot MongoDB. Den hanterar de samlade uppkopplingarna (Connection Pooling) och övrig uppkopplingslogik.

    var client = new MongoClient("mongdb://test:test@localhost/test");

I exemplet ovan använder jag det sättet att skapa en MongClientden med en URL till databasen. URL:en skrivs på formatet

mongodb://<username>:<password>@<hostname>/<database>

Därefter hämtar vi ut en MongoServer ur MongoClient, vilket skapar en ny uppkoppling med de inställningarna som är registrerade i MongoClient.

    var server = Client.GetServer();

Och till sist behövs en MongoDatabase som hämtas ur MongoServer.

    var database = server.GetDatabase("test");

Nu är vi klara att börja läsa och skriva till MongoDB.

CRUD med MongoCollection

Kort om MongoDB som dokumentsdatabas

MongoDB är en dokumentsdatabas. Som relativ nybörjare i området så är jag inte säker på allt vad det betyder, men i grunden så dokumentsdatabaser anpassade för att lagra objekt som är grupperade på något specifikt sätt. Det kan vara ett faktiskt dokument som lagras grupperade med Titel, innehåll, kommentarer, författare och så vidare, där allt lagras i en djup struktur med klasser och underklasser. I C# världen skulle den kunna se ut såhär

public class Memo
{
    public string Title { get; set; }
    public string Body { get; set; }
    public Author Author { get; set; }
    public List<Comment> Comments { get; set; }
}

När ett dokuement som ovan lagras i MongoDB, så kommer MongoDB automatiskt skapa upp ett _id i databasen med ett automatiskt genererat 12-bytes GUID. Det är bara rotobjektet som får detta GUID, det vill säga att Memo-dokumentet kommer få ett _id men inte Author eller Comments. För att nå id:t i din klass så är det enklast att använda sig av datatypen ObjectId. I det fallet klarar C# drivers av att serialisera id-fältet åt dig

public class Memo
{
    public ObjectId Id { get; set; }
    ...
}

Namnet kan vara Id, id eller _id och serialiseringen kommer att fungera utan problem.

Dags att läsa och skriva

Att läsa och skriva till MongoDB sker via en MongoCollection. En Collection i MongoDB är en samling dokument och motsvarar löst en tabell i en relationsdatabas. Om du skapar en collection med den generiska funktionen så får du en MongoCollection som klarar av automagisk översättning av dina klasser till BSON som MongoDB förstår (BSON är en binär representation av ditt data i ett format liknar JSON). Det innebär att om du använder den generiska versionen av MongoCollection så är det bara att skicka in dina objekt och låta MongoDB hantera serialisering och deserialisering till MongoDB. För att få tag på en MongoCollection så skapar du den via MongoDatabase.

    public class Author
    {
        public ObjectId Id { get; set; } 
        public string Name { get; set; }
    }

    // Stoppa in namnet på din Collection i GetCollection
    var collection = database.GetCollection<Author>("Author");

För CRUD-operationerna (samt möjligheten att hämta alla objekt) så gör du följande:

    // Insert (Create)
    public void Insert(Author author)
    {
        collection.Insert(author)
    }

    // Get (Read)
    public void Get(ObjectId Id)
    {
        return collection.FindOneById(Id);
    }

    // Update
    public void Update(Author author)
    {
        collection.Save(author);
    }

    // Delete
    public void Delete(Author author)
    {
        var query = Query.EQ("_id", author.Id);
        collection.Remove(query);
    }

    // Get all
    public void GetAll()
    {
        collection.FindAll();
    }

Delete använder sig av en MongoQuery. Om våra behov blir mer avancerade framöver så kanske jag går in på hur den fungerar.

I nästa del så beskriver jag hur jag byggde upp klasstrukturen kring CRUD-operationerna och uppkopplingen till MongoDB.

En reaktion på ”Läs och skriv till MongoDB med C# driver

  1. Pingback: Fältrapportering med TC55 (Android), ASP.NET och MongoDB | Dev.Datema

Lämna en kommentar