MongoDB dessi-codemotion
Upcoming SlideShare
Loading in...5

MongoDB dessi-codemotion



Codemotion 2010 MongoDB slides, examples with scala casbah salat

Codemotion 2010 MongoDB slides, examples with scala casbah salat



Total Views
Views on SlideShare
Embed Views



13 Embeds 1,447 594 245 194 173 110 62 49 9 6
url_unknown 2 1 1 1



Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
Post Comment
Edit your comment

MongoDB dessi-codemotion MongoDB dessi-codemotion Presentation Transcript

  • Speaker Software architect/developer Pronetics/Sourcesense Founder Spring Italian User Group Chairman JugSardegna Committer/Contributor OpenNMS - MongoDB Author Spring 2.5 Aspect Oriented Programming
  • MongoDB Philosophy
  • Some MongoDB production deployments
  • Main Features
    • Document Oriented
    • - Documents (objects) map nicely to programming language data types
    • - Dynamically-typed (schemaless) for easy schema evolution
    - No joins and no transactions for high performance and easy scalability
    • High Performance
    • - No joins and no transactions makes reads and writes fast
    • - Indexes with indexing into embedded documents and arrays
    • - Optional asynchronous writes
    • Rich Query Language
    • Easy scalability
    • - "slaveOK" reads are distributed over replicated servers
    • - Automatic sharding (auto-partitioning of data across servers)
    • - Reads and writes are distributed over shards
    - No joins and no transactions make distributed queries easy and fast
    • High Availability
    • - Replicated servers with automatic master failover
    • Indexing
    • Stored JavaScript
    • Fixed-size collection
    • File storage
    • MapReduce
  • No Sql Injection Mongo is invulnerable to injection attacks, no code execution
  • Document as Basic unit of Data in BSON (Binary JSON) format
      { "name" : "MongoDB",
    "info" : { "storage" : "Binary JSON (BSON)", "full index" : "true", "scale" : "Autosharding", "query" : "Rich document-base queries", "replication" : "Replica sets", "atomic modifiers" : "Fast in place update", "binary content" : "GridFS", "batch operation" : "Map/Reduce”, " js server side" : ”true” } "greeting": {"international" : "Hello, world!", "italy" :"Ciao Mondo !" } }, "_id” : "024x6f279578a64bb0666945" Document: an Ordered set of keys with associated values
  • Grouping SQL Table contains Rows MONGO Collection and subcollections contains Documents * Document Limit: Larger than 4 Mb, the entire text of War and Peace is 3.14Mb Collection are are created dynamically and automatically grow in size to fit additional data
  • A single instance of MongoDB can host multiple independent databases, each of which can have its own collections and permissions. Photo from
  • No Join's cost
    • SQL
    SELECT * FROM posts INNER JOIN posts_tags ON = posts_tags.post_id INNER JOIN tags ON posts_tags.tag_id == WHERE tags.text = 'politics' AND posts.vote_count > 10;
    • MONGO
    db.posts.find({'tags': 'politics', 'vote_count': {'$gt': 10}});
  • Collections Schema free Documents within a single collection can have any number of different "shapes” In theory, each document in a collection can have a completely different structure; in practice, a collection's documents will be relatively uniform.
  • Driver C, C#, C++, Clojure, D, Delphi, Erlang, Factor, Fantom, F#, Go, Groovy, Haskell, Java, Javascript, Lua, Nodejs, ObjectiveC, Perl, PHP, Python, R, Ruby, Scala, Scheme (PLT), Smalltalk
  • Common operations Fastest : Fire and Forget Command with response : getLastError Examples with: Server side Javascript via mongo shell Java via MongoDB Official 10gen Driver Scala via Casbah Official 10gen scala driver + Salat serializer
  • Inserting //mongo shell db.dcComicsCollection.insert({ " name " : " bruce ", "sur name" : " wayne ", "alias" : " batman " }) //Java Map fields = batman.toMap() dcComicsCollection.insert(BasicDBObjectBuilder.start(fields).get()) //java driver //scala dcComicsCollection.insert(grater[BlogPost].asDBObject(post))
  • Removing //mongo shell db.dcComicsCollection.delete({ " alias " : " superman " }) //java Map query = batman.getMap() DBObject obj = BasicDBObjectBuilder.start(fields).get() dcComicsColl .remove(obj); //scala dcComicsCollection .remove(grater[BlogPost].asDBObject(post))
  • Updating ( The schema can be changed dinamically ) //mongo shell var hero = db.dcComicsColl.findOne({ " alias " : " batman " }); hero.gadget = { " car " : " batmobile ” }; db.dcComicsColl.update({ ” alias ” : ” batman " }, hero, true ); //java DbObject query = BasicDBObjectBuilder.start(). add("surname",”wayne”).get(); DbObject hero = BasicDBObjectBuilder.start().add("gadget",”batmobile”).get(); dcComicsCollection.update(query, hero, false, true ); //scala val query = MongoDBObject( "name" -> "bruce" ) val hero = MongoDBObject( "gadget" -> "batmobile " ) dcComicsCollection.update(query, hero, true, false) * The blue value it's the upsert, update or insert if not present
  • Querying //mongo shell db.dcComicsColl.find({ " alias " : " batman " }) // all field of the doc db.dcComicsColl.find( {"alias":"batman"} ,{”surname":1}) //surname desc //java DBObject query = BasicDBObjectBuilder.start().add("alias", "batman").get() ; DBObject out = BasicDBObjectBuilder.start().add("surname", "1").get() DBCursor cursor = dcComicsColl.find(query, out ); //scala val query = MongoDBObject( "alias" -> "batman" ) val obj = dcComicsColl.findOne(query)
  • Modifier Partial updates $set (set a key, or add if not present) $inc (with numbers) $push (add to the end of an array) $ne $addToSet $each $pop (remove from the end) $pull (remove element that match criteria)
  • Query Criteria Conditionals $lt $lte $gt $gte start = new Date("01/01/20111") db.mycollection.find({"registered" : {"$lt" : start}}) db.dcComicsColl.find({ "surname":{"$ne":"parker"}, "name":{"$ne":"peter"} })
  • Query Criteria Conditionals $in $or, $nin, $not <, <=, >, >=, $ne, $mod, $all, $size, $exists db.attendees.find({”external_num&quot; : {&quot;$nin&quot; : [1356, 525, 874]}}) db.attendees.find({&quot;$or&quot; : [{&quot;ticket_no&quot; : 513}, {&quot;name&quot; : foo}]})
  • Query Regex Perl Compatible Regular Expression //mongo shell db.mycollection.find({&quot;name&quot; : /foo?/i}) //java String pattern = new StringBuilder().append(character).append( &quot;*&quot; ).toString(); DbObject query =BasicDBObjectBuilder.start() .add( &quot;surname&quot; , java.util.regex.Pattern.compile(pattern)).get() List<DBObject> objects = coll .find(query ).toArray(); //scala coll.find(MongoDBObject(&quot;surname&quot; -> &quot;.*yne$&quot;.r))) {...
  • Query on array and grouping Array inside a document $all $size $slice Grouping count distinct group finalize $key
  • Javascript as part of a query db.mycollection.find({ &quot;$where&quot; : function (){ for (var current in this) { … . } } })
  • Indexing db.mycollection.ensureIndex({&quot;name&quot; : 1, &quot;info&quot; : 1 } Geospatial indexing db.mycollection.ensureIndex({&quot;gps&quot; : &quot;2d&quot;}) {&quot;light-years&quot; : &quot;2d&quot;}, {&quot;min”:-10, &quot;max”:10}) Yes it's a Foursquare feature :)
  • GridFS GridFS is a specification for storing large files such video, photos, blob in MongoDB . GridFS uses two collections to store data:
    • files contains the object metadata
    • chunks contains the binary chunks with some additional accounting information
  • Map Reduce map = function() { for (var key in this) { emit(key, {count : 1}); }; } reduce = function(key, emits) { total = 0; for (var i in emits) { total += emits[i].count; } return {&quot;count&quot; : total}; }
  • Scaling
  • Scaling
  • Shard Sharding = break up collections into smaller chunks Splitting data and storing different portions of the data on different machines, also know as partitioning The chunks can be distributed across shards so that each shard is responsible for a subset of the total data set. A shard is a container that holds a subset of a collection’s data. A shard is either a single mongod server (for development/testing) or a replica set (for production). Thus, even if there are many servers in a shard, there is only one master, and all of the servers contain the same data.
  • Mongos The client don't know what shard has what data, or even that data is broken up on different shards. In front of the shard run routing process called mongos. This router know when the data are located and the client can see a normal mongod, like a noshard environment. This is the router process and comes with all MongoDB distributions. It basically just routes requests and aggregates responses. It doesn’t store any data or config- uration information. (Although it does cache information from the config servers.)
  • Config server Config servers store the configuration of the cluster: which data is on which shard. Because mongos doesn’t store anything permanently, it needs somewhere to get the shard configuration. It syncs this data from the config servers.
  • Replication Replica set, clustering with automatic failover Master is elected by the cluster and may change to another node if the current master goes down. This election process will be initiated by any node that cannot reach the primary. The highest-priority most-up-to-date server will become the new primary. The replication is asynchronous
  • Scala Webapp Demo
  • Admin Interface
  • Mongo Shell
  • Mac Client MongoHub
  • Books
  • References
    • MongoDB :
    • Casbah:
    • Salat:
    • Slides scala code example:
  • Thanks ! Massimiliano Dessì