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

Building Your First App: An Introduction to MongoDB (MongoDB LA 2013)

Building Your First App: An Introduction to MongoDB (MongoDB LA 2013)

29392a12bce98d5f0de66043d17f378b?s=128

Brandon Black

February 21, 2013
Tweet

Transcript

  1. Software Engineer, 10gen @brandonmblack Brandon Black #MongoDBDays Building Your First

    App: An Introduction to MongoDB
  2. What is MongoDB?

  3. MongoDB is a ___________ database •  Document •  Open source

    •  High performance •  Horizontally scalable •  Full featured
  4. Document Database •  Not for .PDF & .DOC files • 

    A document is essentially an associative array •  Document == JSON object •  Document == PHP Array •  Document == Python Dict •  Document == Ruby Hash
  5. Open Source •  MongoDB is an open source project • 

    On GitHub •  Licensed under the AGPL •  Started & sponsored by 10gen •  Commercial licenses available •  Contributions welcome
  6. High Performance •  Written in C++ •  Extensive use of

    memory-mapped files i.e. read-through write-through memory caching. •  Runs nearly everywhere •  Data serialized as BSON (fast parsing) •  Full support for primary & secondary indexes •  Document model = less work
  7. www.etiennemansard.com Horizontally Scalable

  8. Full Featured •  Ad Hoc queries •  Real time aggregation

    •  Rich query capabilities •  Traditionally consistent •  Geospatial features •  Support for most programming languages •  Flexible schema
  9. Database Landscape Depth of Functionality Scalability & Performance Memcached MongoDB

    RDBMS
  10. http://www.mongodb.org/downloads

  11. Mongo Shell

  12. Document Database

  13. RDBMS MongoDB Table, View  Collection Row  Document Index

     Index Join  Embedded Document Foreign Key  Reference Partition  Shard Terminology
  14. Typical (relational) ERD User ·Name ·Email address Category ·Name ·URL

    Comment ·Comment ·Date ·Author Article ·Name ·Slug ·Publish date ·Text Tag ·Name ·URL
  15. MongoDB ERD User ·Name ·Email address Article ·Name ·Slug ·Publish

    date ·Text ·Author Comment[] ·Comment ·Date ·Author Tag[] ·Value Category[] ·Value
  16. http://www.flickr.com/photos/somegeekintn/3484353131/ Library Management Application

  17. First step in any application is Determine your entities

  18. Library Management Application Entities •  Library Patrons (users) •  Books

    (catalog) •  Authors •  Publishers •  Categories ??
  19. In a relational based app We would start by doing

    schema design
  20. Relational Schema Design •  Large ERD Diagrams •  Complex create

    table statements •  ORMs to map tables to objects •  Tables just to join tables together •  For this simple app we'd have 5 tables and 5 join tables •  Lots of revisions until we get it just right
  21. In a MongoDB based app We start building our app

    and let the schema evolve
  22. MongoDB Collections •  Users •  Books •  Authors •  Publishers

  23. No Common Language Mongo Shell

  24. Working with MongoDB

  25. user = { username: 'fred.jones', first_name: 'fred', last_name: 'jones', }

    Start with an Object (or array, hash, dict, etc)
  26. > db.users.insert(user) Insert the Record No collection creation needed

  27. > db.users.findOne() { "_id" : ObjectId("50804d0bd94ccab2da652599"), "username" : "fred.jones", "first_name"

    : "fred", "last_name" : "jones" } Querying for the User
  28. _id •  _id is the primary key in MongoDB • 

    Automatically indexed •  Automatically created as an ObjectId if not provided •  Any unique immutable value could be used
  29. ObjectId •  ObjectId is a special 12 byte value • 

    Guaranteed to be unique across your cluster •  ObjectId("50804d0bd94ccab2da652599") |-------------||---------||-----||----------| ts mac pid inc
  30. > db.author.insert({ first_name: 'j.r.r.', last_name: 'tolkien', bio: 'J.R.R. Tolkien (1892.1973),

    beloved throughout the world as the creator of The Hobbit and The Lord of the Rings, was a professor of Anglo-Saxon at Oxford, a fellow of Pembroke College, and a fellow of Merton College until his retirement in 1959. His chief interest was the linguistic aspects of the early English written tradition, but even as he studied these classics he was creating a set of his own.' }) Creating an Author
  31. > db.author.findOne( { last_name : 'tolkien' } ) { "_id"

    : ObjectId("507ffbb1d94ccab2da652597"), "first_name" : "j.r.r.", "last_name" : "tolkien", "bio" : "J.R.R. Tolkien (1892.1973), beloved throughout the world as the creator of The Hobbit and The Lord of the Rings, was a professor of Anglo-Saxon at Oxford, a fellow of Pembroke College, and a fellow of Merton College until his retirement in 1959. His chief interest was the linguistic aspects of the early English written tradition, but even as he studied these classics he was creating a set of his own." } Querying for Our Author
  32. > db.books.insert({ title: 'fellowship of the ring, the', author: ObjectId("507ffbb1d94ccab2da652597"),

    language: 'english', genre: ['fantasy', 'adventure'], publication: { name: 'george allen & unwin', location: 'London', date: new Date('21 July 1954'), } }) Creating a Book http://society6.com/PastaSoup/The-Fellowship-of-the-Ring-ZZc_Print/
  33. > db.books.findOne({language: 'english'}, {genre: 1}) { "_id" : ObjectId("50804391d94ccab2da652598"), "genre"

    : [ "fantasy", "adventure" ] } Multiple Values Per Key
  34. > db.books.findOne({genre: 'fantasy'}, {title: 1}) { "_id" : ObjectId("50804391d94ccab2da652598"), "title"

    : "fellowship of the ring, the" } Multiple Values Per Key Query key with single value or multiple values the same way.
  35. > db.books.findOne({}, {publication: 1}) { "_id" : ObjectId("50804ec7d94ccab2da65259a"), "publication" :

    { "name" : "george allen & unwin", "location" : "London", "date" : ISODate("1954-07-21T04:00:00Z") } } Nested Values
  36. > db.books.findOne( {'publication.date' : { $lt : new Date('21 June

    1960')} } ) { "_id" : ObjectId("50804391d94ccab2da652598"), "title" : "fellowship of the ring, the", "author" : ObjectId("507ffbb1d94ccab2da652597"), "language" : "english", "genre" : [ "fantasy", "adventure" ], "publication" : { "name" : "george allen & unwin", "location" : "London", "date" : ISODate("1954-07-21T04:00:00Z") } } Query Nested Values with Dot Notation
  37. > db.books.update( {"_id" : ObjectId("50804391d94ccab2da652598")}, { $set : { isbn:

    '0547928211', pages: 432 } }) Update Books This is true agile development . I’m simply changing how I work with the data, and the database follows.
  38. db.books.findOne() { "_id" : ObjectId("50804ec7d94ccab2da65259a"), "author" : ObjectId("507ffbb1d94ccab2da652597"), "genre" :

    [ "fantasy", "adventure" ], "isbn" : "0395082544", "language" : "english", "pages" : 432, "publication" : { "name" : "george allen & unwin", "location" : "London", "date" : ISODate("1954-07-21T04:00:00Z") }, "title" : "fellowship of the ring, the" } Updated Book Record
  39. > db.books.ensureIndex({title: 1}) > db.books.ensureIndex({genre : 1}) > db.books.ensureIndex({'publication.date': -1})

    Creating Indexes
  40. > db.books.findOne({title : /^fell/}) { "_id" : ObjectId("50804ec7d94ccab2da65259a"), "author" :

    ObjectId("507ffbb1d94ccab2da652597"), "genre" : [ "fantasy", "adventure" ], "isbn" : "0395082544", "language" : "english", "pages" : 432, "publication" : { "name" : "george allen & unwin", "location" : "London", "date" : ISODate("1954-07-21T04:00:00Z") }, "title" : "fellowship of the ring, the" } Query with Regular Expressions
  41. > db.books.insert({ title: 'two towers, the', author: ObjectId("507ffbb1d94ccab2da652597"), language: 'english',

    isbn : "034523510X", genre: ['fantasy', 'adventure'], pages: 447, publication: { name: 'george allen & unwin', location: 'London', date: new Date('11 Nov 1954'), } }) Adding More Books http://society6.com/PastaSoup/The-Two-Towers-XTr_Print/
  42. > db.books.insert({ title: 'return of the king, the', author: ObjectId("507ffbb1d94ccab2da652597"),

    language: 'english', isbn : "0345248295", genre: ['fantasy', 'adventure'], pages: 544, publication: { name: 'george allen & unwin', location: 'London', date: new Date('20 Oct 1955'), } }) Adding More Books http://society6.com/PastaSoup/The-Return-of-the-King-Jsc_Print/
  43. > db.books.find( { author: ObjectId("507ffbb1d94ccab2da652597")}) .sort({ 'publication.date' : -1}) .limit(1)

    { "_id" : ObjectId("5080d33ed94ccab2da65259d"), "title" : "return of the king, the", "author" : ObjectId("507ffbb1d94ccab2da652597"), "language" : "english", "isbn" : "0345248295", "genre" : [ "fantasy", "adventure" ], "pages" : 544, "publication" : { "name" : "george allen & unwin", "location" : "London", "date" : ISODate("1955-10-20T04:00:00Z") } } Cursors
  44. page_num = 3; results_per_page = 10; cursor = db.books.find() .sort({

    "publication.date" : -1 }) .skip((page_num - 1) * results_per_page) .limit(results_per_page); Simple Pager
  45. > book = db.books.findOne({"title" : "return of the king, the"})

    > db.author.findOne({_id: book.author}) { "_id" : ObjectId("507ffbb1d94ccab2da652597"), "first_name" : "j.r.r.", "last_name" : "tolkien", "bio" : "J.R.R. Tolkien (1892.1973), beloved throughout the world as the creator of The Hobbit and The Lord of the Rings, was a professor of Anglo-Saxon at Oxford, a fellow of Pembroke College, and a fellow of Merton College until his retirement in 1959. His chief interest was the linguistic aspects of the early English written tradition, but even as he studied these classics he was creating a set of his own." } Finding an Author by Book
  46. MongoDB Drivers

  47. Real applications are not built in the shell

  48. MongoDB Drivers •  Drivers connect to mongo servers •  Drivers

    translate BSON into native types •  The MongoDB shell is not a driver, but works like one in some ways •  Installed using typical means (npm, pecl, gem, pip)
  49. MongoDB has native bindings for over 12 languages

  50. None
  51. None
  52. Next Steps

  53. We've introduced a lot of concepts here

  54. Schema Design @ 10:35am User ·Name ·Email address Article ·Name

    ·Slug ·Publish date ·Text ·Author Comment[] ·Comment ·Date ·Author Tag[] ·Value Category[] ·Value
  55. 7 16 1 2 5 6 9 12 18 21

    B-Trees 13 {x: 13} Indexing @ 12:15pm
  56. Secondary Secondary Primary Client Application Driver Write Read Read Replication

    @ 1:45pm
  57. Node 1 Secondary Config Server Node 1 Secondary Config Server

    Node 1 Secondary Config Server Shard Shard Shard Mongos App Server Mongos App Server Mongos App Server Sharding @ 2:30pm
  58. •  What’s next? –  Schema Design @ 10:35am –  Indexing

    @ 12:15pm –  Replication @ 1:45pm –  Sharding @ 2:30pm –  Webinar: Technical Overview of MongoDB (March 7th) –  MongoDB User Group •  Resources https://education.10gen.com/ http://www.10gen.com/presentations http://github.com/brandonblack/presentations
  59. Software Engineer, 10gen @brandonmblack Brandon Black #MongoDBDays Thank You