MongoDb for .Net folks – Having a quick go with MongoLab

This time we will have a quick look at using MongoDb as a service. The provider we will look at is MongoLab. It takes about 5 minutes to be up and running. Add a couple of minutes and you will have used Postman to do what we have done in the previous articles. Inserting and updating simple document.

Previous articles are:

Create an account with MongoLab

Just head over to MongoLab and create a free account. The process will need you to chose an account name and an username. The next step is to create a database. I wanted to have MongoDb v2.2, and when I created the db, this was only possible if I chosed Amazon and US-east.

When it’s created, open up the details view for the database by clicking on it in the MongoLab GUI. There you will find detailed info about how to connect to your database.

Use MongoLab’s REST API with Postman

MongoLab has a nice REST API. Lets start playing with it, accomplishing more or less the same thing as we did in the first article. For this I will use Postman, an a extension to Google Chrome. The API-key can be found under the user view. That is the user you selected when you created the account. Look for a link up to the right.

Now, lets do something really simple. Lets inspect what collection exists. Issue a GET against the db to inpect what collections there are:

GET: https://api.mongolab.com/api/1/databases/foodb/collections?apiKey=xxxxxxxxxx

That would look something like this:

Notice a nice feature with Postman. Each request gets stored in a history so that you can re-execute them. Now lets store a new document. Just POST to an URL defining the collection you want to store the document int. Eg. persons:

POST: https://api.mongolab.com/api/1/databases/foodb/collections/persons?apiKey=xxxxxxxxxx

That’s it! It’s as simple as that. But lets touch on something we haven’t before. In the first article I just added a property age to the document and re-saved it. What I did was pushing the whole document in again. Let’s mess things up and you’ll see what I mean. Let’s try and do the same with the REST API. First lets see if we can get the document back, using the _id:50489991e4b03e51cfb0cc4f of the document:

GET: https://api.mongolab.com/api/1/databases/foodb/collections/persons/50489991e4b03e51cfb0cc4f?apiKey=xxxxxxxxxx

you should see something like this:

{
    "_id": {"$oid": "50489991e4b03e51cfb0cc4f"},
    "first": "Daniel",
    "last": "Wertheim"
}

Lets introduce age. Do a PUT, and pass in { age: 32 }:

PUT: https://api.mongolab.com/api/1/databases/foodb/collections/persons/50489991e4b03e51cfb0cc4f?apiKey=xxxxxxxxxx
Body: { age: 32 }

You will now be presented with a response looking like this:

{
    "_id": {"$oid": "50489991e4b03e51cfb0cc4f"},
    "age": 32
}

Ooops! Away went the rest of the document. Lets restore it. Do a PUT and pass this {first:'Daniel',last:'Wertheim'}. After this PUT, your document should have first and last as properties. Now let’s patch the existing document instead, and extend it with age. We do this by using the $set modifier. There’s a bunch of modifiers. Look in the docs.

PUT: https://api.mongolab.com/api/1/databases/foodb/collections/persons/50489991e4b03e51cfb0cc4f?apiKey=xxxxxxxxxx
Body: { $set: { age: 32 } }

This time the response will look like this:

{
    "_id": {"$oid": "50489991e4b03e51cfb0cc4f"},
    "age": 32,
    "first": "Daniel",
    "last": "Wertheim"
}

This is not an issue with the REST API. The same goes with the console.

Wait, REST you say. That means…

Yes, you can use e.g jQuery do interact with it. Lets have a quick look. There’s a premade jsFiddle for this. Look here. But basically, just use the URL to target the correct resource. Then pick the right http-verb, and when neccessary, provide data. A simple GET for our document would look like this:

(function($){
    $(function(){
        var outputcontainer = $('#output');
        var onsuccessfulget = function(d){
            var li = $('<li>');
            $('<pre>').text(JSON.stringify(d)).appendTo(li);
            li.appendTo(outputcontainer);
        };
        $('#getDoc').bind('click', function(){
            $.ajax({
                type: 'GET',
                url: 'https://api.mongolab.com/api/1/databases/foodb/collections/persons/50489991e4b03e51cfb0cc4f?apiKey=xxxxxxxxxx',
                success: onsuccessfulget
            });
        });        
    });
})(jQuery);

There’s also JS-libs that wraps the REST calls. One example is: https://github.com/mattnull/MongoLab.js. Haven’t tried it myself though.

Does MongoLab only support REST?

No of course not. You can connect to it using the C# driver. Lets try the code we wrote in the first article. The only thing you would need to updated is the line where we create the server:

var server = MongoServer.Create("mongodb://myuser:mypwd@ds035167.mongolab.com:35167/foodb/?safe=true");

A little note. I had an “@” sign in my password. It needs to be encoded. You can use this code for getting the correct URL:

var url = new MongoUrlBuilder("mongodb://ds035167.mongolab.com:35167/foodb/?safe=true")
{
    DefaultCredentials = new MongoCredentials("myuser", "myp@ss")
}.ToMongoUrl();

var server = MongoServer.Create(url);

That’s it. The code shall now work the same.

Summary

This time we have been looking at how easy it is to start using MongoDb as a service. For this we looked at MongoLab and I showed you how easy it is the integrate with their REST API. Next time will be about something else. I’ve promised to look at querying and hopefully I will stand by my word in the next article.

2 thoughts on “MongoDb for .Net folks – Having a quick go with MongoLab

  1. Pingback: The Morning Brew - Chris Alcock » The Morning Brew #1184

  2. Pingback: MongoDb for .Net folks – a quick theoretical peak what schema-less means | Daniel Wertheim

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s