Mongo db for C# Developers

9,240 views
8,819 views

Published on

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,240
On SlideShare
0
From Embeds
0
Number of Embeds
1,618
Actions
Shares
0
Downloads
107
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Mongo db for C# Developers

  1. 1. MongoDB for C# Developers Simon Elliston Ball @sireb Saturday, 12 October 13
  2. 2. http://www.mongodb.org/ Saturday, 12 October 13
  3. 3. Document Database Saturday, 12 October 13
  4. 4. Document Database id full_name address 1 3a Test Street 2 John Smith Jane Doe 1b Fake Street 3 ... ... Saturday, 12 October 13
  5. 5. Document Database id address 1 John Smith Jane Doe 3a Test Street 2 1b Fake Street 3 id full_name ... ... 1 customer_i d 1 ... order_dat e 2013-10-1 2 1 ... 0 ... 3 ... ... ... Saturday, 12 October 13
  6. 6. Document Database id full_name address 1 John Smith Jane Doe 3a Test Street 2 1b Fake Street id customer_id ... 1 3 1 1 2 customer_i d3 1 2 1 ... 3 ... ... id Saturday, 12 October 13 1 ...... ... order_date 2013-10-10 order_dat ... e 2013-10-1 ... 0 ... ...
  7. 7. Document Database id full_name address 1 John Smith Jane Doe 3a Test Street 2 1b Fake Street id customer_id ... 1 3 1 1 2 customer_i d3 1 2 1 ... 3 ... ... id Saturday, 12 October 13 1 ...... ... order_date 2013-10-10 order_dat ... e 2013-10-1 ... 0 ... ...
  8. 8. Document Database id full_name address 1 John Smith Jane Doe 3a Test Street 2 1b Fake Street id customer_id ... 1 3 1 1 2 customer_i d3 1 2 1 ... 3 ... ... id Saturday, 12 October 13 1 ...... ... order_date 2013-10-10 order_dat ... e 2013-10-1 ... 0 ... ... 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" } ]
  9. 9. Key -> JSON Saturday, 12 October 13
  10. 10. Saturday, 12 October 13
  11. 11. Saturday, 12 October 13
  12. 12. Saturday, 12 October 13
  13. 13. • Transactions per document • ACID, multi-document • Master-slave replication • Master-master replication • Many many languages: C#, • .NET Only JavaScript, Java, PHP, Python, Ruby, Scala, Erlang, Go, C, C++, Perl (and those are just the official ones) Saturday, 12 October 13
  14. 14. Getting started with MongoDB Download from http://www.mongodb.org/ Saturday, 12 October 13
  15. 15. Saturday, 12 October 13
  16. 16. Getting started with the C# client PM> Install-Package mongocsharpdriver Saturday, 12 October 13
  17. 17. Saturday, 12 October 13
  18. 18. Wooah there. I thought you said JSON... Saturday, 12 October 13
  19. 19. BSON Binary JSON Saturday, 12 October 13
  20. 20. BSON Binary JSON Typed Saturday, 12 October 13
  21. 21. BSON Binary JSON Typed Serialisation library Saturday, 12 October 13
  22. 22. BSON Binary JSON Typed Serialisation library Annotate POCOs to control mapping or write config code if you must Saturday, 12 October 13
  23. 23. Connecting... var connectionString = "mongodb://localhost"; var client = new MongoClient(connectionString); var server = client.GetServer(); Saturday, 12 October 13
  24. 24. Connecting... var connectionString = "mongodb://localhost"; var client = new MongoClient(connectionString); var server = client.GetServer(); That’s it. The driver will disconnect, release objects and pool for you. But... Saturday, 12 October 13
  25. 25. Collections Database Collection Document _id field Saturday, 12 October 13
  26. 26. CRUD creating new documents With mapped entities: 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) The BsonDocument way: 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); Saturday, 12 October 13
  27. 27. CRUD creating new documents The BsonDocument way: 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); Beware of mixing your BSONs List<Developer> allDevelopers = developerResults.ToList<Developer>(); Saturday, 12 October 13
  28. 28. CRUD creating new documents Beware of mixing your BSONs List<Developer> allDevelopers = developerResults.ToList<Developer>(); Saturday, 12 October 13
  29. 29. CRUD basic document reads MongoCursor<BsonDocument> documentResults = documentCollection.FindAll(); MongoCursor<Developer> developerResults = developerCollection.FindAll(); Saturday, 12 October 13
  30. 30. 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
  31. 31. 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) { ... } var readQuery = Query<Developer>.EQ(n => n.PersonId, 2); Developer developerRead = developerCollection.FindOne(readQuery); Saturday, 12 October 13
  32. 32. 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) { ... } var readQuery = Query<Developer>.EQ(n => n.PersonId, 2); Developer developerRead = developerCollection.FindOne(readQuery); BsonDocument documentRead = documentCollection.FindOne(new QueryDocument { { "_id", documentId } }); Saturday, 12 October 13
  33. 33. CRUD update developerRead.LastName = "Something-Else"; developerCollection.Save(developerRead); Saturday, 12 October 13
  34. 34. 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
  35. 35. 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
  36. 36. 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
  37. 37. 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
  38. 38. CRUD deleting var query = new QueryDocument { { "LastName", "Person" } }; collection.Remove(query); Saturday, 12 October 13
  39. 39. CRUD deleting var query = new QueryDocument { { "LastName", "Person" } }; collection.Remove(query); collection.RemoveAll(); collection.Drop(); Saturday, 12 October 13
  40. 40. 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
  41. 41. 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
  42. 42. 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, it’s a word count. Yes, it’s JavaScript. Saturday, 12 October 13
  43. 43. 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
  44. 44. Acknowledgements MongoDB, Mongo, and the leaf logo are registered trademarks of MongoDB, Inc. Saturday, 12 October 13
  45. 45. 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
  46. 46. Questions? Simon Elliston Ball simon.ellistonball@red-gate.com @sireb Saturday, 12 October 13

×