0% found this document useful (0 votes)
78 views46 pages

Mongodb For C# Developers: Simon Elliston Ball @sireb

This document discusses using MongoDB with C# developers. It covers downloading and setting up the MongoDB C# driver, connecting to a MongoDB database, performing basic CRUD operations on documents using the driver, and more advanced features like geospatial queries, MapReduce, and GridFS for large files. Examples are provided throughout using the C# driver API.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
78 views46 pages

Mongodb For C# Developers: Simon Elliston Ball @sireb

This document discusses using MongoDB with C# developers. It covers downloading and setting up the MongoDB C# driver, connecting to a MongoDB database, performing basic CRUD operations on documents using the driver, and more advanced features like geospatial queries, MapReduce, and GridFS for large files. Examples are provided throughout using the C# driver API.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 46

MongoDB for C# Developers

Simon Elliston Ball


@sireb
Saturday, 12 October 13
http://www.mongodb.org/
Saturday, 12 October 13
Document Database
Saturday, 12 October 13
Document Database
id full_name address
1 John
Smith
3a Test Street
2 Jane Doe 1b Fake Street
3 ... ...
Saturday, 12 October 13
id customer_i
d
order_dat
e
1 1 ... 2013-10-1
0
2 1 ... ...
3 ... ... ...
Document Database
id full_name address
1 John
Smith
3a Test Street
2 Jane Doe 1b Fake Street
3 ... ...
Saturday, 12 October 13
id customer_i
d
order_dat
e
1 1 ... 2013-10-1
0
2 1 ... ...
3 ... ... ...
Document Database
id full_name address
1 John
Smith
3a Test Street
2 Jane Doe 1b Fake Street
3 ... ...
id customer_id order_date
1 1 2013-10-10
2 1 ...
3 ... ...
Saturday, 12 October 13
id customer_i
d
order_dat
e
1 1 ... 2013-10-1
0
2 1 ... ...
3 ... ... ...
Document Database
id full_name address
1 John
Smith
3a Test Street
2 Jane Doe 1b Fake Street
3 ... ...
id customer_id order_date
1 1 2013-10-10
2 1 ...
3 ... ...
Saturday, 12 October 13
id customer_i
d
order_dat
e
1 1 ... 2013-10-1
0
2 1 ... ...
3 ... ... ...
Document Database
id full_name address
1 John
Smith
3a Test Street
2 Jane Doe 1b Fake Street
3 ... ...
id customer_id order_date
1 1 2013-10-10
2 1 ...
3 ... ...
customers = [
{
"_id" : ObjectId("5256b399ac46b80084974d9a"),
"name" : "John Smith",
"address" : "3a Test Street",
"orders" [ {
"order_date": "2013-10-10",
"order_item": [
{ "product": "Widget"...}
...
]
...
}]
},
{
"_id" : ObjectId("5256b3a8ac46b80084974d9b"),
"name" : "Jane Doe",
"address" : "1b Fake Street"
}
]
Saturday, 12 October 13
Key -> JSON
Saturday, 12 October 13
Saturday, 12 October 13
Saturday, 12 October 13
Saturday, 12 October 13

Transactions per document

Master-slave replication

Many many languages: C#,


JavaScript, Java, PHP, Python, Ruby,
Scala, Erlang, Go, C, C++, Perl (and those are just
the ofcial ones)

ACID, multi-document

Master-master replication

.NET Only
Saturday, 12 October 13
Getting started with MongoDB
Download from http://www.mongodb.org/
Saturday, 12 October 13
Saturday, 12 October 13
Getting started with the C# client
PM> Install-Package mongocsharpdriver
Saturday, 12 October 13
Saturday, 12 October 13
Wooah there.
I thought you said JSON...
Saturday, 12 October 13
BSON Binary JSON
Saturday, 12 October 13
BSON Binary JSON
Typed
Saturday, 12 October 13
BSON Binary JSON
Typed
Serialisation library
Saturday, 12 October 13
BSON Binary JSON
Typed
Serialisation library
Annotate POCOs to control mapping
or write cong code if you must
Saturday, 12 October 13
Connecting...
var connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
var server = client.GetServer();
Saturday, 12 October 13
Connecting...
Thats it.
The driver will disconnect,
release objects and pool for you.
But...
var connectionString = "mongodb://localhost";
var client = new MongoClient(connectionString);
var server = client.GetServer();
Saturday, 12 October 13
Collections
Database
Collection
Document
_id
eld
Saturday, 12 October 13
CRUD creating new documents
var developerCollection = database.GetCollection<Developer>("team");
var Developer = new Developer(1,"Test", "Person");
developerCollection.Insert(Developer);
var Developer2 = new Developer(2,"Another", "Developer");
developerCollection.Insert(Developer2)
var documentCollection = database.GetCollection("team");
BsonDocument document = new BsonDocument();
document.Add(new BsonElement("name", "Testing"))
.Add(new BsonElement("number", new BsonInt32(42)));
documentCollection.Insert(document);
The BsonDocument way:
With mapped entities:
Saturday, 12 October 13
CRUD creating new documents
var documentCollection = database.GetCollection("team");
BsonDocument document = new BsonDocument();
document.Add(new BsonElement("name", "Testing"))
.Add(new BsonElement("number", new BsonInt32(42)));
documentCollection.Insert(document);
The BsonDocument way:
Beware of mixing your BSONs
List<Developer> allDevelopers = developerResults.ToList<Developer>();
Saturday, 12 October 13
CRUD creating new documents
Beware of mixing your BSONs
List<Developer> allDevelopers = developerResults.ToList<Developer>();
Saturday, 12 October 13
CRUD basic document reads
MongoCursor<BsonDocument> documentResults = documentCollection.FindAll();
MongoCursor<Developer> developerResults = developerCollection.FindAll();
Saturday, 12 October 13
CRUD basic document reads
MongoCursor<BsonDocument> documentResults = documentCollection.FindAll();
MongoCursor<Developer> developerResults = developerCollection.FindAll();
var cursor = collection.FindAll();
cursor.Skip = 100;
cursor.Limit = 10;
foreach (var developer in cursor) {
...
Saturday, 12 October 13
CRUD basic document reads
MongoCursor<BsonDocument> documentResults = documentCollection.FindAll();
MongoCursor<Developer> developerResults = developerCollection.FindAll();
var readQuery = Query<Developer>.EQ(n => n.PersonId, 2);
Developer developerRead = developerCollection.FindOne(readQuery);
var cursor = collection.FindAll();
cursor.Skip = 100;
cursor.Limit = 10;
foreach (var developer in cursor) {
...
}
Saturday, 12 October 13
CRUD basic document reads
MongoCursor<BsonDocument> documentResults = documentCollection.FindAll();
MongoCursor<Developer> developerResults = developerCollection.FindAll();
var readQuery = Query<Developer>.EQ(n => n.PersonId, 2);
Developer developerRead = developerCollection.FindOne(readQuery);
BsonDocument documentRead = documentCollection.FindOne(new QueryDocument {
{ "_id", documentId }
});
var cursor = collection.FindAll();
cursor.Skip = 100;
cursor.Limit = 10;
foreach (var developer in cursor) {
...
}
Saturday, 12 October 13
CRUD update
developerRead.LastName = "Something-Else";
developerCollection.Save(developerRead);
Saturday, 12 October 13
CRUD update
Write Concerns
Only relevant with Replication
The number replica which need to report successful writes
collection.Save(developerRead, new MongoInsertOptions
{
WriteConcern = WriteConcern.WMajority
}
);
Saturday, 12 October 13
CRUD update
var update = new UpdateDocument {
{ "$set", new BsonDocument("LastName", "A new name") }
};
var query = new QueryDocument {
{ "LastName", "Developer" }
};
collection.Update(query, update);
NB. Only updates one document
Saturday, 12 October 13
CRUD update
var update = new UpdateDocument {
{ "$set", new BsonDocument("LastName", "A new name") }
};
var query = new QueryDocument {
{ "LastName", "Developer" }
};
collection.Update(query, update);
NB. Only updates one document
collection.Update(query, update, new MongoUpdateOptions
{
Flags = UpdateFlags.Multi
});
Applies to all documents that match query
Saturday, 12 October 13
CRUD upsert
var update = new UpdateDocument {
{ "$set", new BsonDocument("LastName", "A new name") }
};
var query = Query<Developer>.EQ(d => d.PersonId, 10);
collection.Update(query, update, new MongoUpdateOptions
{
Flags = UpdateFlags.Upsert
});
Saturday, 12 October 13
CRUD deleting
var query = new QueryDocument {
{ "LastName", "Person" }
};
collection.Remove(query);
Saturday, 12 October 13
CRUD deleting
var query = new QueryDocument {
{ "LastName", "Person" }
};
collection.Remove(query);
collection.RemoveAll();
collection.Drop();
Saturday, 12 October 13
LINQ integration
Just make the collection queryable
using System.Linq;
using MongoDB.Driver.Linq;
var query =
from e in collection.AsQueryable()
where e.LastName == "Person"
select e;
foreach (var developer in query){
...
Saturday, 12 October 13
GridFS in C#
16MB document limit
GridFS used to break documents into chunks
using (var fs = new FileStream("largeVideo.m4v", FileMode.Open))
{
database.GridFS.Upload(fs, "largeVideo.m4v");
}
database.GridFS.Download("test.m4v", "largeVideo.m4v");
Saturday, 12 October 13
MapReduce (JavaScript)
var map =
"function() {" +
" for (var key in this) {" +
" emit(key, { count : 1 });" +
" }" +
"}";
var reduce =
"function(key, emits) {" +
" total = 0;" +
" for (var i in emits) {" +
" total += emits[i].count;" +
" }" +
" return { count : total };" +
"}";
var mr = collection.MapReduce(map, reduce);
Yes, its a word count. Yes, its JavaScript.
Saturday, 12 October 13
Special Queries GeoNear
var query = Query.EQ("properties.amenity", new BsonString("pub"));

// here
double lon = 54.9117468;
double lat = -1.3737675;
var earthRadius = 6378.0; // km
var rangeInKm = 3000.0; // km
var options = GeoNearOptions
.SetMaxDistance(rangeInKm / earthRadius /* to radians */)
.SetSpherical(true);
var results = collection.GeoNear(query, lat, lon, 10, options);
foreach (var result in results.Hits)
...
Saturday, 12 October 13
Acknowledgements
MongoDB, Mongo, and the leaf logo are registered trademarks of MongoDB, Inc.
Saturday, 12 October 13
Resources
The MongoDB C Sharp Language Center:
http://docs.mongodb.org/ecosystem/drivers/csharp/
A tutorial on the driver from MongoDB themselves:
http://docs.mongodb.org/ecosystem/tutorial/use-csharp-driver/#csharp-driver-tutorial
Sample code from this talk:
https://github.com/simonellistonball/MongoForCsharpSamples
A good walkthrough on MongoDB with ASP.NET MVC:
http://www.drdobbs.com/database/mongodb-with-c-deep-dive/240152181
Bonus extras
A Glimpse plugin to view mongo query details:
https://github.com/simonellistonball/Glimpse.MongoDB
Saturday, 12 October 13
Questions?
Simon Elliston Ball
[email protected]
@sireb
Saturday, 12 October 13

You might also like