Building Your First App with MongoDB

976 views

Published on

Tyler Brock's Presentation from An Evening with MongoDB Portland

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
976
On SlideShare
0
From Embeds
0
Number of Embeds
457
Actions
Shares
0
Downloads
35
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide
  • AGPL – GNU Affero General Public License
  • * Big endian and ARM not supported.
  • Kristine to update this graphic at some point
  • Kristine to update this graphic at some point
  • Flexibility afforded us by having rich data structures
  • Ask question: Is categories it's own entity? It could be, but it's likely a property of books.
  • Notice how they are the same as the entities listed above
  • " 50804d0bd94ccab2da652599 " is a 24 byte string (12 byte ObjectId hex encoded).
  • Powerful message here. Finally a database that enables rapid & agile development.
  • Creating a book here. A few things to make note of.
  • Powerful message here. Finally a database that enables rapid & agile development.
  • Creating a book here. A few things to make note of.
  • Creating a book here. A few things to make note of.
  • This is fine for small result sets. Not good performance for large result sets. Range query plus limit will give better performance.
  • 10gen Drivers
  • Plus community drivers.
  • This graphic should be updated at some point.
  • Building Your First App with MongoDB

    1. 1. Software Engineer, 10genTyler BrockBuilding your first app;an introduction to MongoDB
    2. 2. What is MongoDB
    3. 3. MongoDB is a ___________database• Document• Open source• High performance• Horizontally scalable
    4. 4. Document Database• Not for .PDF & .DOC files• A document is essentially an associativearray– Document == JavaScript Object– Document == PHP Array– Document == Python Dictionary– Document == Ruby Hash– etc
    5. 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. 6. High Performance• Written in C++• Extensive use of memory-mapped filesi.e. read-through write-through memorycaching.• Runs nearly everywhere• Data serialized as BSON (fast parsing)• Full support for primary & secondary indexes• Document model = less work
    7. 7. Horizontally Scalable
    8. 8. Full Featured• Ad Hoc queries• Real time aggregation• Rich query capabilities• Traditionally consistent• Geospatial features• Support for most programming languages• Flexible schema
    9. 9. Database Landscape
    10. 10. http://www.mongodb.org/downloads
    11. 11. Mongo Shell
    12. 12. Document Database
    13. 13. RDBMS MongoDBTable, View ➜ CollectionRow ➜ DocumentIndex ➜ IndexJoin ➜ Embedded DocumentForeign Key ➜ ReferencePartition ➜ ShardTerminology
    14. 14. Typical (relational) ERD
    15. 15. MongoDB ERD
    16. 16. First step in any applicationisDetermine your entities
    17. 17. In a relational based appWe would start by doingschema design
    18. 18. Relational schema design• Large ERD Diagrams• Complex create table statements• ORMs to map tables to objects• Tables just to join tables together• Lots of revisions until we get it just right
    19. 19. In a MongoDB based appWe start building our appand let the schema evolve
    20. 20. Working with MongoDB
    21. 21. http://www.flickr.com/photos/somegeekintn/3484353131/We will build a librarymanagement application
    22. 22. MongoDB collections• Users• Books• Authors• Publishers
    23. 23. user = {username: fred.jones,first_name: fred,last_name: jones,}Start with an object(or array, hash, dict, etc)
    24. 24. > db.users.insert(user)Insert the recordNo collection creation needed
    25. 25. > db.users.findOne(){"_id" : ObjectId("50804d0bd94ccab2da652599"),"username" : "fred.jones","first_name" : "fred","last_name" : "jones"}Querying for the user
    26. 26. _id• _id is the primary key in MongoDB• Automatically indexed• Automatically created as an ObjectId if notprovided• Any unique immutable value could be used
    27. 27. ObjectId• ObjectId is a special 12 byte value• Guaranteed to be unique across your cluster• ObjectId("50804d0bd94ccab2da652599")|-------------||---------||-----||----------|ts mac pidinc
    28. 28. > db.author.insert({first_name: j.r.r.,last_name: tolkien,bio: J.R.R. Tolkien (1892.1973), beloved throughout theworld as the creator of The Hobbit and The Lord of the Rings, wasa professor of Anglo-Saxon at Oxford, a fellow of PembrokeCollege, and a fellow of Merton College until his retirement in1959. His chief interest was the linguistic aspects of the earlyEnglish written tradition, but even as he studied these classics hewas creating a set of his own.})Creating an author
    29. 29. > 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 theworld as the creator of The Hobbit and The Lord of the Rings, wasa professor of Anglo-Saxon at Oxford, a fellow of PembrokeCollege, and a fellow of Merton College until his retirement in1959. His chief interest was the linguistic aspects of the earlyEnglish written tradition, but even as he studied these classics hewas creating a set of his own."}Querying for our author
    30. 30. > 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 Bookhttp://society6.com/PastaSoup/The-Fellowship-of-the-Ring-ZZc_Print/
    31. 31. > db.books.findOne({language: english}, {genre: 1}){"_id" : ObjectId("50804391d94ccab2da652598"),"genre" : ["fantasy","adventure"]}Multiple values per key
    32. 32. > db.books.findOne({genre: fantasy}, {title: 1}){"_id" : ObjectId("50804391d94ccab2da652598"),"title" : "fellowship of the ring, the"}Querying for key withmultiple valuesQuery key with single value ormultiple values the same way.
    33. 33. > db.books.findOne({}, {publication: 1}){"_id" : ObjectId("50804ec7d94ccab2da65259a"),"publication" : {"name" : "george allen & unwin","location" : "London","date" : ISODate("1954-07-21T04:00:00Z")}}Nested Values
    34. 34. > 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")}}Reach into nested valuesusing dot notation
    35. 35. > db.books.update({"_id" :ObjectId("50804391d94ccab2da652598")},{ $set : {isbn: 0547928211,pages: 432}})Update booksTrue agile development .Simply change how you work withthe data and the database follows
    36. 36. 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"}The Updated Book record
    37. 37. > db.books.ensureIndex({title: 1})> db.books.ensureIndex({genre : 1})> db.books.ensureIndex({publication.date: -1})Creating indexes
    38. 38. > 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"}Querying with RegEx
    39. 39. > 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 a few more bookshttp://society6.com/PastaSoup/The-Two-Towers-XTr_Print/
    40. 40. > 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 a few more bookshttp://society6.com/PastaSoup/The-Return-of-the-King-Jsc_Print/
    41. 41. > 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
    42. 42. 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);Paging
    43. 43. > 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 asthe creator of The Hobbit and The Lord of the Rings, was a professor ofAnglo-Saxon at Oxford, a fellow of Pembroke College, and a fellow of MertonCollege until his retirement in 1959. His chief interest was the linguisticaspects of the early English written tradition, but even as he studied theseclassics he was creating a set of his own."}Finding author by book
    44. 44. MongoDB Drivers
    45. 45. Real applications are notbuilt in the shell
    46. 46. MongoDB has nativebindings for over 12languages
    47. 47. MongoDB drivers• Official Support for 12 languages• Community drivers for tons more• Drivers connect to mongo servers• Drivers translate BSON into native types• mongo shell is not a driver, but works likeone in some ways• Installed using typical means (npm, pecl,gem, pip)
    48. 48. Next Steps
    49. 49. Weve introduced a lot ofconcepts here
    50. 50. Schema Design w/ Emily
    51. 51. Software Engineer, 10genTyler BrockQuestions?• Next: Schema Design w/ Emily

    ×