Istanbul Hackers
Geekly Weekly
Mongo DB
@hserdarb
Why MongoDB?
• Easy to use nosql
• Good for web projects
• Popular 
• High performance (No joins and embedding makes reads and writes fast)
• High availability (Replicated servers with automatic master failover)
• Easy scalability (Automatic sharding)
What’s MongoDB good for?
• Account and user profiles: can store arrays of addresses with ease
• CMS: the flexible schema of MongoDB is great for heterogeneous collections of content types
• Form data: MongoDB makes it easy to evolve structure of form data over time
• Blogs / user-generated content: can keep data with complex relationships together in one object
• Messaging: vary message meta-data easily per message or message type without needing to
maintain separate collections or schemas
• System configuration: just a nice object graph of configuration values, which is very natural in
MongoDB
• Log data of any kind: structured log data is the future
• Graphs: just objects and pointers – a perfect fit
• Location based data: MongoDB understands geo-spatial coordinates and natively supports geo-
spatial indexing
http://blog.mongolab.com/2012/08/why-is-mongodb-wildly-popular/
The Modern Need From Databases
• Easy to use when project is small
• Developing schema less
• When we need scale it must be easy and cheap
• No data loss
• High Availability
RDBMS => MongoDB
RDBMS MongoDB
Table, View Collection
Row JSON Document
Index Index
Join Embeded Document
Partition Shard
Partition Key Shard Key
What is BSON?
• MongoDB uses BSON as the data storage and network transfer format
for "documents".
• Short for Binary JSON
• http://bsonspec.org/
• http://www.mongodb.org/display/DOCS/BSON
Working with Entity Objects
• Things can be really easy for you if you follow these rules for your
entities
• Has a public no-argument constructor
• Has a public get set property for each value you want to have serialized
CRUD
https://github.com/serdarb/IstanbulHackersCodeReviewSample/blob/master/AgileWall.Domain/Repo/BaseRepo.cs
Write Concern
• Acknowledged
• Write operations that use this write concern will wait for acknowledgement from the primary
server before returning.
• Unacknowledged
• Write operations that use this write concern will return as soon as the message is written to
the socket.
• Journaled
• Exceptions are raised for network issues, and server errors; the write operation waits for the
server to group commit to the journal file on disk.
• Replica Acknowledged
• Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the
write operation.
http://docs.mongodb.org/manual/core/write-concern/
http://api.mongodb.org/java/current/com/mongodb/WriteConcern.html
https://github.com/mongodb/mongo-csharp-driver/blob/master/MongoDB.Driver/WriteConcern.cs
Journaling
• Process starts with private view
• Private view writes to journal
• Journal updates shared view
• Shared view updates private view
• Shared view flushes data to disk
http://www.kchodorow.com/blog/2012/10/04/how-mongodbs-journaling-works/
Index
• BasketItems.CreateIndex(“UserId”);
A tip for better indexing
• Run mongodb with notablescan parameter and be sure your your
queries are not making full table scans...
• You get exceptions if a query needs a table scan, it gives you a chance to fix
your indexes on development time.
Map Reduce
Transaction
• MongoDB does not support transactions.
• It is good to use relational databases (oracle, sql server) for this
purpose
• If you are stuck in a situation that needs transactions with MongoDB
you must implement it by your self.
• http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/
• https://github.com/rystsov/mongodb-transaction-example
Sharding & Replication
Sharding is for scale out, replication is for high availability
Replication
• Copies of your data for data safety
• Asynchronous replication
• Master - Slave model
• Not master-master, when your data change
there are times that you only have one master…
• Statement based
• For example, insert statement send to the
replica and will run there…
• Driver is replica set aware,
• Connection to replica set
mongodb://server1,server2:27017,server2:27018
Sharding (partitioning)
• MongoDB does range based
partitioning
• Name begins with A, B-E, F-H ….
• Shardkey is important!
• Bad shard key choice can cause
too many split and merge
operations on chunks
mongod
mongod
mongod
Replicaset
mongod
mongod
mongod
Replicaset
S1 S2
mongos
mongod
mongod
mongod
Config
Server
Client
1
2
3
4
Sources
• education.10gen.com
• http://openmymind.net/mongodb.pdf
• http://www.mongodb.org/display/DOCS/Introduction
• http://www.mongodb.org/display/DOCS/Padding+Factor
• https://github.com/mongodb/mongo
• http://www.codeproject.com/Articles/273145/Using-MongoDB-with-the-Official-Csharp-Driver
• http://stackoverflow.com/questions/4067197/mongodb-and-joins
• http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-EmbeddingandLinking
• http://docs.mongodb.org/manual/applications/database-references/
• http://www.10gen.com/presentations?programming_lang=46
• https://speakerdeck.com/mongodb/whats-new-in-the-net-driver
• http://learnmongo.com/
• http://www.mongovue.com/2010/11/03/yet-another-mongodb-map-reduce-tutorial/
• http://spp42.com/mongodbde-dogru-index-kullanimi-nasil-kontrol-edilir-i/
• http://bjclark.me/2009/08/nosql-if-only-it-was-that-easy/
• http://reactivemongo.org/

MongoDB

  • 1.
  • 2.
    Why MongoDB? • Easyto use nosql • Good for web projects • Popular  • High performance (No joins and embedding makes reads and writes fast) • High availability (Replicated servers with automatic master failover) • Easy scalability (Automatic sharding)
  • 3.
    What’s MongoDB goodfor? • Account and user profiles: can store arrays of addresses with ease • CMS: the flexible schema of MongoDB is great for heterogeneous collections of content types • Form data: MongoDB makes it easy to evolve structure of form data over time • Blogs / user-generated content: can keep data with complex relationships together in one object • Messaging: vary message meta-data easily per message or message type without needing to maintain separate collections or schemas • System configuration: just a nice object graph of configuration values, which is very natural in MongoDB • Log data of any kind: structured log data is the future • Graphs: just objects and pointers – a perfect fit • Location based data: MongoDB understands geo-spatial coordinates and natively supports geo- spatial indexing http://blog.mongolab.com/2012/08/why-is-mongodb-wildly-popular/
  • 4.
    The Modern NeedFrom Databases • Easy to use when project is small • Developing schema less • When we need scale it must be easy and cheap • No data loss • High Availability
  • 5.
    RDBMS => MongoDB RDBMSMongoDB Table, View Collection Row JSON Document Index Index Join Embeded Document Partition Shard Partition Key Shard Key
  • 6.
    What is BSON? •MongoDB uses BSON as the data storage and network transfer format for "documents". • Short for Binary JSON • http://bsonspec.org/ • http://www.mongodb.org/display/DOCS/BSON
  • 7.
    Working with EntityObjects • Things can be really easy for you if you follow these rules for your entities • Has a public no-argument constructor • Has a public get set property for each value you want to have serialized
  • 8.
  • 9.
    Write Concern • Acknowledged •Write operations that use this write concern will wait for acknowledgement from the primary server before returning. • Unacknowledged • Write operations that use this write concern will return as soon as the message is written to the socket. • Journaled • Exceptions are raised for network issues, and server errors; the write operation waits for the server to group commit to the journal file on disk. • Replica Acknowledged • Exceptions are raised for network issues, and server errors; waits for at least 2 servers for the write operation. http://docs.mongodb.org/manual/core/write-concern/ http://api.mongodb.org/java/current/com/mongodb/WriteConcern.html https://github.com/mongodb/mongo-csharp-driver/blob/master/MongoDB.Driver/WriteConcern.cs
  • 10.
    Journaling • Process startswith private view • Private view writes to journal • Journal updates shared view • Shared view updates private view • Shared view flushes data to disk http://www.kchodorow.com/blog/2012/10/04/how-mongodbs-journaling-works/
  • 11.
  • 12.
    A tip forbetter indexing • Run mongodb with notablescan parameter and be sure your your queries are not making full table scans... • You get exceptions if a query needs a table scan, it gives you a chance to fix your indexes on development time.
  • 13.
  • 14.
    Transaction • MongoDB doesnot support transactions. • It is good to use relational databases (oracle, sql server) for this purpose • If you are stuck in a situation that needs transactions with MongoDB you must implement it by your self. • http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/ • https://github.com/rystsov/mongodb-transaction-example
  • 15.
    Sharding & Replication Shardingis for scale out, replication is for high availability
  • 16.
    Replication • Copies ofyour data for data safety • Asynchronous replication • Master - Slave model • Not master-master, when your data change there are times that you only have one master… • Statement based • For example, insert statement send to the replica and will run there… • Driver is replica set aware, • Connection to replica set mongodb://server1,server2:27017,server2:27018
  • 17.
    Sharding (partitioning) • MongoDBdoes range based partitioning • Name begins with A, B-E, F-H …. • Shardkey is important! • Bad shard key choice can cause too many split and merge operations on chunks mongod mongod mongod Replicaset mongod mongod mongod Replicaset S1 S2 mongos mongod mongod mongod Config Server Client 1 2 3 4
  • 18.
    Sources • education.10gen.com • http://openmymind.net/mongodb.pdf •http://www.mongodb.org/display/DOCS/Introduction • http://www.mongodb.org/display/DOCS/Padding+Factor • https://github.com/mongodb/mongo • http://www.codeproject.com/Articles/273145/Using-MongoDB-with-the-Official-Csharp-Driver • http://stackoverflow.com/questions/4067197/mongodb-and-joins • http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-EmbeddingandLinking • http://docs.mongodb.org/manual/applications/database-references/ • http://www.10gen.com/presentations?programming_lang=46 • https://speakerdeck.com/mongodb/whats-new-in-the-net-driver • http://learnmongo.com/ • http://www.mongovue.com/2010/11/03/yet-another-mongodb-map-reduce-tutorial/ • http://spp42.com/mongodbde-dogru-index-kullanimi-nasil-kontrol-edilir-i/ • http://bjclark.me/2009/08/nosql-if-only-it-was-that-easy/ • http://reactivemongo.org/