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

Transcript

42 slides
  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

More Decks by Sridhar Nanjundeswaran

Other Decks in Technology