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. 1
    Sridhar Nanjundeswaran, 10gen
    [email protected]
    @snanjund

    View full-size slide

  2. 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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  5. 6
    RDBMS MongoDB
    Table Collection
    Row(s) Document
    Index Index
    Partition Shard
    Join Embedding/Linking
    Fixed Schema Flexible/Implied Schema

    View full-size slide

  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
    }

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  9. 10
    •Want to build an app where users can check in to
    a location
    •Leave notes or comments about that location

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  12. 13
    users
    user1, user2
    loc1, loc2, loc3
    locations checkins
    checkin1, checkin2

    View full-size slide

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

    View full-size slide

  14. 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"})

    View full-size slide

  15. 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"})

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  18. 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"})

    View full-size slide

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

    View full-size slide

  20. 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"})

    View full-size slide

  21. 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]}})

    View full-size slide

  22. 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"})

    View full-size slide

  23. 24
    Atomic operators:
    $set, $unset, $inc, $push, $pushAll, $pull, $pullAll, $bit

    View full-size slide

  24. 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!"}
    }})

    View full-size slide

  25. 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!"
    }]
    }

    View full-size slide

  26. 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

    View full-size slide

  27. 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"})

    View full-size slide

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

    View full-size slide

  29. 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)

    View full-size slide

  30. 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

    View full-size slide

  31. 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})

    View full-size slide

  32. 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()

    View full-size slide

  33. 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}]

    View full-size slide

  34. 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}

    View full-size slide

  35. 36
    Deployment

    View full-size slide

  36. 37
    P
    • Single server
    - need a strong backup plan

    View full-size slide

  37. 38
    • Single server
    - need a strong backup plan
    • Replica sets
    - High availability
    - Automatic failover
    P
    P S S

    View full-size slide

  38. 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

    View full-size slide

  39. 40
    User Data Management High Volume Data Feeds
    Content Management Operational Intelligence E-Commerce

    View full-size slide

  40. 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

    View full-size slide