Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Building Your First MongoDB Application

mongodb
April 20, 2012
320

Building Your First MongoDB Application

Presented at MongoDB Stockholm 2012, Ross Lawley of 10gen gives the Building Your First MongoDB Application talk.

This talk will introduce the features of MongoDB by walking through how one can building a simple location-based checkin application using MongoDB. The talk will cover the basics of MongoDB's document model, query language, map-reduce framework and deployment architecture.

mongodb

April 20, 2012
Tweet

Transcript

  1. Today's Talk • Quick introduction to mongoDB • Using a

    location-based app as an example • Data modelling in mongoDB, queries, geospatial, updates and map reduce. • Example works in mongoDB JS shell Friday, April 20, 12
  2. Where can you use mongoDB? MongoDB is Implemented in C++

    • Platforms 32/64 bit Windows, Linux, Mac OS-X, FreeBSD, Solaris Drivers are available in many languages 10gen supported • C, C# (.Net), C++, Erlang, Haskell, Java, JavaScript, Perl, PHP, Python, Ruby, Scala, nodejs Community supported • Clojure, ColdFusion, F#, Go, Groovy, Lua, R ... http://www.mongodb.org/display/DOCS/Drivers Friday, April 20, 12
  3. Terminology RDBMS MongoDB Table Collection Row(s) JSON Document Index Index

    Join Embedding & Linking Partition Shard Partition Key Shard Key Friday, April 20, 12
  4. { _id : ObjectId("4c4ba5c0672c685e5e8aabf3"), author : "Ross", date : ISODate("2012-02-02T11:52:27.442Z"),

    text : "About MongoDB...", tags : [ "tech", "databases" ], comments : [{ author : "Fred", date : ISODate("2012-02-03T17:22:21.124Z"), text : "Best Post Ever!" }], comment_count : 1 } Example Document Friday, April 20, 12
  5. BSON • JSON has powerful, but limited set of datatypes

    • BSON adds data types with ObjectID, Date, Ints .. • BSON is a binary representation of JSON • Optimized for performance and navigational abilities • MongoDB uses BSON as the storage and network transfer format for "documents". See: bsonspec.org Friday, April 20, 12
  6. Why use mongoDB? • Intrinsic support for agile development •

    Super low latency access to your data • Very little CPU overhead • No additional caching layer required • Built in replication and horizontal scaling support Friday, April 20, 12
  7. Building Your First MongoDB App • Want to build an

    app where users can check in to a location • Leave notes or comments about that location Iterative Approach: • Decide requirements • Design documents • Rinse, repeat :-) Friday, April 20, 12
  8. Requirements "As a user I want to be able to

    find other locations nearby" • Need to store locations (Offices, Restaurants etc) • name, address, tags • coordinates • Stretch Task! - User generated content e.g. tips / notes Friday, April 20, 12
  9. Requirements "As a user I want to be able to

    'checkin' to a location" Checkins • User should be able to 'check in' to a location • Want to be able to generate statistics: • Recent checkins • Popular locations Friday, April 20, 12
  10. > location_1 = { name: "Clarion Hotel", address: "Östra Järnvägsgatan

    35", city: "Stockholm", post_code: 10117 } Locations v1 Friday, April 20, 12
  11. > location_1 = { name: "Clarion Hotel", address: "Östra Järnvägsgatan

    35", city: "Stockholm", post_code: 10117 } > db.locations.save(location_1) > db.locations.find({name: "Clarion Hotel"}) Locations v1 Friday, April 20, 12
  12. > location_2 = { name: "Clarion Hotel", address: "Östra Järnvägsgatan

    35", city: "Stockholm", post_code: 10117, tags: ["hotel", "conference", "mongodb"] } Locations v2 Friday, April 20, 12
  13. > location_2 = { name: "Clarion Hotel", address: "Östra Järnvägsgatan

    35", city: "Stockholm", post_code: 10117, tags: ["hotel", "conference", "mongodb"] } > db.locations.ensureIndex({tags: 1}) > db.locations.find({tags: "hotel"}) Locations v2 Friday, April 20, 12
  14. > location_3 = { name: "Clarion Hotel", address: "Östra Järnvägsgatan

    35", city: "Stockholm", post_code: 10117, tags: ["hotel", "conference", "mongodb"], lat_long: [52.5184, 13.387] } Locations v3 Friday, April 20, 12
  15. > location_3 = { name: "Clarion Hotel", address: "Östra Järnvägsgatan

    35", city: "Stockholm", post_code: 10117, tags: ["hotel", "conference", "mongodb"], lat_long: [52.5184, 13.387] } > db.locations.ensureIndex({lat_long: "2d"}) > db.locations.find({lat_long: {$near:[52.53, 13.4]}}) Locations v3 Friday, April 20, 12
  16. // creating your indexes: > db.locations.ensureIndex({name: 1}) > db.locations.ensureIndex({tags: 1})

    > db.locations.ensureIndex({lat_long: "2d"}) // with regular expressions: > db.locations.find({name: /^clar/i}) // by tag: > db.locations.find({tag: "hotel"}) // finding places: > db.locations.find({lat_long: {$near:[52.53, 13.4]}}) Finding locations Friday, April 20, 12
  17. // initial data load: > db.locations.insert(location_3) // adding a tip

    with update: > db.locations.update( {name: "Clarion Hotel"}, {$push: { tips: { user: "Ross", date: ISODate("05-04-2012"), tip: "Check out my replication talk later!"} }}) Inserting locations - adding tips Friday, April 20, 12
  18. > db.locations.findOne() { _id : ObjectId("5c4ba5c0672c685e5e8aabf3"), name: "Clarion Hotel", address:

    "Östra Järnvägsgatan 35", city: "Stockholm", post_code: 10117, tags: ["hotel", "conference", "mongodb"], lat_long: [52.5184, 13.387], tips:[{ user: "Ross", date: ISODate("05-04-2012"), tip: "Check out my replication talk later!" }] } Stretch task - done Friday, April 20, 12
  19. Requirements "As a user I want to be able to

    find other locations nearby" Need to store locations (Offices, Restaurants etc) • name, address, tags • coordinates • Stretch task! - User generated content e.g. tips / notes "As a user I want to be able to 'checkin' to a location" Checkins • User should be able to 'check in' to a location • Want to be able to generate statistics: • Recent checkins • Popular locations Friday, April 20, 12
  20. > user_1 = { _id: "[email protected]", name: "Ross", twitter: "RossC0",

    checkins: [ {location: "Clarion Hotel", ts: "05/04/2012"}, {location: "Arlanda Airport", ts: "04/04/2012"} ] } Users and Checkins Friday, April 20, 12
  21. // find all users who've checked in here: > db.users.find({"checkins.location":"Clarion

    Hotel"}) // Can't find the last 10 checkins easily > db.users.find({"checkins.location":"Clarion Hotel"}) .sort({"checkins.ts": -1}).limit(10) Schema hard to query for stats. Simple Stats Friday, April 20, 12
  22. > user_2 = { _id: "[email protected]", name: "Ross", twitter: "RossC0",

    } > checkin_1 = { location: location_id, user: user_id, ts: ISODate("05-04-2012") } > db.checkins.find({user: user_id}) User and Checkins v2 Friday, April 20, 12
  23. // find all users who've checked in here: > loc

    = db.locations.findOne({"name":"Clarion Hotel"}) > users = db.checkins.find({location: loc._id}) > u_ids = users.map(function(u){return u.user}) > users = db.users.find({_id: {$in: u_ids}}) // find the last 10 checkins here: > db.checkins.find({location: loc._id}) .sort({ts: -1}).limit(10) // count how many checked in today: > db.checkins.find({location: loc._id, ts: {$gt: midnight}} ).count() Simple Stats Friday, April 20, 12
  24. // Find most popular locations > map_func = function() {

    emit(this.location, 1); } > reduce_func = function(key, values) { return Array.sum(values); } > db.checkins.mapReduce(map_func, reduce_func, {query: {ts: {$gt: now_minus_3_hrs}}, out: "result"}) > db.result.findOne() {"_id": "Clarion Hotel", "value" : 17} Map Reduce Friday, April 20, 12
  25. // Find most popular locations > agg = db.checkins.aggregate( {$match:

    {ts: {$gt: now_minus_3_hrs}}}, {$group: {_id: "$location", value: {$sum: 1}}} ) > agg.result [{"_id": "Clarion Hotel", "value" : 17}] Aggregation Friday, April 20, 12
  26. Deployment • Single server - need a strong backup plan

    • Replica sets - High availability - Automatic failover P P S S Friday, April 20, 12
  27. Deployment • Single server - need a strong backup plan

    • Replica sets - High availability - Automatic failover • Sharded - Horizontally scale - Auto balancing P S S P S S P P S S Friday, April 20, 12
  28. MongoDB Use Cases • Archiving • Content Management • Ecommerce

    • Finance • Gaming • Government • Metadata Storage • News & Media • Online Advertising • Online Collaboration • Real-time stats/analytics • Social Networks • Telecommunications Friday, April 20, 12
  29. @mongodb conferences, appearances, and meetups http://www.10gen.com/events http://bit.ly/mongofb Facebook | Twitter

    | LinkedIn http://linkd.in/joinmongo download at mongodb.org support, training, and this talk brought to you by Friday, April 20, 12