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.

Installera MongoDB på Windows Server

Följande är en beskrivning av hur jag installerade MongoDB på Windows Server 2012, men proceduren ska vara i stort sett likadan för alla Windows Vista/Server 2008 SR2 eller senare.

Med installation av MongoDB så är det nedan punkter jag kommer gå igenom.

Fortsätt läsa

Fältrapportering med TC55 (Android), ASP.NET och MongoDB

En riktigt härlig del med att vara utvecklare på Datema är att vi har både stora till små projekt. Vi har bland annat PSS – Självskanning som är ett långlivat projekt med konstant utveckling. På andra sidan står de små ofta kundspecifika projekten, som visserligen kan leva under lång tid, men som vanligtvis innebär en intensiv period av utveckling, följt av en lång period av support med endast sporadisk utveckling när omvärlden kräver det. Vi har också projekt som landar någonstans i mitten, där Easy Sales vår lösning för fältsälj är ett bra exempel. Det är ett system som lever i cykler av kortare perioder av utvecklingen följt av en tid av underhåll.

Easy Field Service

Datema har lång erfarenhet av datainsamling och ett av systemen som snurrat längst är Easy Field Service. Den består av ett Web Service-lager ovanpå en MSSQL-databas, och en applikation skriven för bättre begagnade Windows Mobile 6.5 (vilket inte ska blandas ihop med Windows Phone som är Microsofts nuvarande operativsystem för mobiltelefoner). Den vanligaste handdatorn som används av Easy Field Service idag är ES400 från Motorola Solutions. och den ska nu bytas ut. Vi har ett tätt samarbete med Motorola Solutions, så ersättaren till ES400 blev nästa generation, den Android-baserade TC55:an.

Flört med världen utanför Redmond

Eftersom vi ändå behöver bygga en ny klient och byta ut stora delar av kommunikationen till servern så passar vi på och lyfter hela plattformen till senaste nyaste. Vi jobbar huvudsakligen med C# och Microsofts ASP.NET så valet föll till ASP.NET Web API för ett REST API för appen och ASP.NET MVC för att slunga HTML till en webb-backend. Det som blir lite spännande i detta projekt är att efter moget och demokratiskt övervägande av alla utvecklare inte på semester (dvs. mig själv) så använder vi MongoDB som databas eftersom systemets dynamiska struktur är klart bättre lämpad för en dokumentsdatabas än en relationsdatabas (jag har hanterat trädstrukturer i en relationsdatabas tidigare och det innebär mycket smärta och tårar för att få till på rätt sätt). Utöver databasförändringarna så har närvarande utvecklare även beslutat att AngularJS kommer användas i webbläsaren. Exakt hur SPA-liknande det blir i slutändan återstår att se, men efter att ha upplevt MVVM-magin med KnockoutJS i ett par projekt så lär det ta ett tag innan jag lämnar MVVMs automagiska värld.

Mina erfarenheter kring allt detta kommer jag skriva om i senare inlägg och först upp är installationen av MongoDB.

Del 1: Installera MongoDB på Windows Server är ny tillgänglig
Del 2: Läs och skriv till MongoDB med C# driver