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

Building your first MongoDB app

Building your first MongoDB app

Presented at Dataweek 2012 (Sept) in SF

Sridhar Nanjundeswaran

September 24, 2012
Tweet

More Decks by Sridhar Nanjundeswaran

Other Decks in Technology

Transcript

  1. 2 • Quick introduction to mongoDB • Data modeling in

    mongoDB, queries, geospatial, updates and map reduce. • Using a location-based app as an example • Example works in mongoDB JS shell
  2. 3

  3. 4 MongoDB is a scalable, high-performance, open source, document-oriented database.

    • Fast Querying • In-place updates • Full Index Support • Replication /High Availability • Auto-Sharding • Aggregation; Map/Reduce • GridFS
  4. 5 MongoDB is Implemented in C++ • Windows, Linux, Mac

    OS-X, Solaris Drivers are available in many languages 10gen supported • C, C# (.Net), C++, Erlang, Haskell, Java, JavaScript, Perl, PHP, Python, Ruby, Scala, nodejs • Multiple community supported drivers
  5. 6 RDBMS MongoDB Table Collection Row(s) Document Index Index Partition

    Shard Join Embedding/Linking Fixed Schema Flexible/Implied Schema
  6. 7 { _id : ObjectId("4c4ba5c0672c685e5e8aabf3"), author : “Sridhar", date :

    ISODate("2012-02-02T11:52:27.442Z"), text : "About MongoDB...", tags : [ "tech", "databases", "nosql" ], comments : [{ author : "Doug", date : ISODate("2012-02-03T17:22:21.124Z"), text : "Best Post Ever!" }], comment_count : 1 }
  7. 8 •JSON has powerful, limited set of datatypes – Mongo

    extends datatypes with Date, Int types, ObjectId, … •MongoDB stores data in BSON •BSON is a binary representation of JSON – Optimized for performance and navigational abilities – Also compression See: bsonspec.org
  8. 9 • Intrinsic support for fast, iterative development • Super

    low latency access to your data • Very little CPU overhead • No additional caching layer required • Built in replication and horizontal scaling support
  9. 10 •Want to build an app where users can check

    in to a location •Leave notes or comments about that location
  10. 11 "As a user I want to be able to

    find other locations nearby" • Need to store locations (Offices, Restaurants, etc) – name, address, tags – coordinates – User generated content e.g. tips / notes
  11. 12 "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
  12. 14 > location_1 = { name: "Lotus Flower", address: "123

    University Ave", city: "Palo Alto", zipcode: 94012 }
  13. 15 > location_1 = { name: "Lotus Flower", address: "123

    University Ave", city: "Palo Alto", zipcode: 94012 } > db.locations.save(location_1) > db.locations.find({name: "Lotus Flower"})
  14. 16 > location_1 = { name: "Lotus Flower", address: "123

    University Ave", city: "Palo Alto", zipcode: 94012 } > db.locations.ensureIndex({name: 1}) > db.locations.find({name: "Lotus Flower"})
  15. 17 > location_2 = { name: "Lotus Flower", address: "123

    University Ave", city: "Palo Alto", zipcode: 94012, tags: ["restaurant", "dumplings"] }
  16. 18 > location_2 = { name: "Lotus Flower", address: "123

    University Ave", city: "Palo Alto", zipcode: 94012, tags: ["restaurant", "dumplings"] } > db.locations.ensureIndex({tags: 1})
  17. 19 > location_2 = { name: "Lotus Flower", address: "123

    University Ave", city: "Palo Alto", zipcode: 94012, tags: ["restaurant", "dumplings"] } > db.locations.ensureIndex({tags: 1}) > db.locations.find({tags: "dumplings"})
  18. 20 > location_3 = { name: "Lotus Flower", address: "123

    University Ave", city: "Palo Alto", zipcode: 94012, tags: ["restaurant", "dumplings"], lat_long: [52.5184, 13.387] }
  19. 21 > location_3 = { name: "Lotus Flower", address: "123

    University Ave", city: "Palo Alto", zipcode: 94012, tags: ["restaurant", "dumplings"], lat_long: [52.5184, 13.387] } > db.locations.ensureIndex({lat_long: "2d"})
  20. 22 > location_3 = { name: "Lotus Flower", address: "123

    University Ave", city: "Palo Alto", zipcode: 94012, tags: ["restaurant", "dumplings"], lat_long: [52.5184, 13.387] } > db.locations.ensureIndex({lat_long: "2d"}) > db.locations.find({lat_long: {$near:[52.53, 13.4]}})
  21. 23 // creating your indexes: > db.locations.ensureIndex({tags: 1}) > db.locations.ensureIndex({name:

    1}) > db.locations.ensureIndex({lat_long: "2d"}) // finding places: > db.locations.find({lat_long: {$near:[52.53, 13.4]}}) // with regular expressions: > db.locations.find({name: /^Lin/}) // by tag: > db.locations.find({tag: "dumplings"})
  22. 25 // initial data load: > db.locations.insert(location_3) // adding a

    tip with update: > db.locations.update( {name: "Lotus Flower"}, {$push: { tips: { user: “Sridhar", date: ISODate("2012-09-21T11:52:27.442Z"), tip: "The sesame dumplings are awesome!"} }})
  23. 26 > db.locations.findOne() { name: "Lotus Flower", address: "123 University

    Ave", city: "Palo Alto", zipcode: 94012, tags: ["restaurant", "dumplings"], lat_long: [52.5184, 13.387], tips:[{ user: “Sridhar", date: ISODate("2012-09-23T11:52:27.442Z"), tip: "The sesame dumplings are awesome!" }] }
  24. 27 "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
  25. 28 > user_1 = { _id: “[email protected]", name: “Sridhar", twitter:

    “snanjund", checkins: [ {location: "Lotus Flower", ts: ISODate("2012-09-21T11:52:27.442Z")}, {location: “Sheraton", ts: ISODate("2012-09-22T07:15:00.442Z")} ] } > db.users.ensureIndex({"checkins.location": 1}) > db.users.find({"checkins.location": "Lotus Flower"})
  26. 29 // find all users who've checked in here: >

    db.users.find({"checkins.location":"Lotus Flower"})
  27. 30 // find all users who've checked in here: >

    db.users.find({"checkins.location":"Lotus Flower"}) // find the last 10 checkins here? > db.users.find({"checkins.location":"Lotus Flower"}) .sort({"checkins.ts": -1}).limit(10)
  28. 31 // find all users who've checked in here: >

    db.users.find({"checkins.location":"Lotus Flower"}) // find the last 10 checkins here: - Warning! > db.users.find({"checkins.location":"Lotus Flower"}) .sort({"checkins.ts": -1}).limit(10) Hard to query for last 10
  29. 32 > user_2 = { _id: “[email protected]", name: “Sridhar", twitter:

    “snanjund", } > checkin_1 = { location: location_id, user: user_id, ts: ISODate("2012-09-21T11:52:27.442Z") } > db.checkins.ensureIndex({user: 1}) > db.checkins.find({user: user_id})
  30. 33 // find all users who've checked in here: >

    location_id = db.locations.find({"name":"Lotus Flower"}) > u_ids = db.checkins.find({location: location_id}, {_id: -1, user: 1}) > users = db.users.find({_id: {$in: u_ids}}) // find the last 10 checkins here: > db.checkins.find({location: location_id}) .sort({ts: -1}).limit(10) // count how many checked in today: > db.checkins.find({location: location_id, ts: {$gt: midnight}} ).count()
  31. 34 // Find most popular locations > agg = db.checkins.aggregate(

    {$match: {ts: {$gt: now_minus_3_hrs}}}, {$group: {_id: "$location", numEntries: {$sum: 1}}} ) > agg.result [{"_id": "Lotus Flower", "numEntries" : 17}]
  32. 35 // 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": "Lotus Flower", "value" : 17}
  33. 38 • Single server - need a strong backup plan

    • Replica sets - High availability - Automatic failover P P S S
  34. 39 • 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
  35. 41

  36. 42 @mongodb © Copyright 2010 10gen Inc. conferences, appearances, and

    meetups http://www.10gen.com/events http://bit.ly/mongofb Facebook | Twitter | LinkedIn http://linkd.in/joinmongo download at mongodb.org We’re Hiring ! [email protected] @snanjund