Building Your First App: An Introduction to MongoDB
 

Like this? Share it with your network

Share

Building Your First App: An Introduction to MongoDB

on

  • 1,149 views

 

Statistics

Views

Total Views
1,149
Views on SlideShare
1,026
Embed Views
123

Actions

Likes
1
Downloads
28
Comments
0

4 Embeds 123

http://www.10gen.com 102
http://www.mongodb.com 15
http://drupal1.10gen.cc 4
https://www.mongodb.com 2

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • Introduction and QuestionsHow many are currently using MongoDB?How many of you came from a relational database background?Emphasize the messagePreview of our talkLook at what makes MongoDB differentWalk through building your first application with MongoDB
  • Let’s talk about what we mean by this….
  • What do we mean by document?
  • AGPL – GNU Affero General Public License
  • * Big endian and ARM not supported.
  • Where can you get it?
  • Easy to use and interact withNo additional tools required, just jump right into the shell
  • Entity-relationship diagram
  • Kristine to update this graphic at some point
  • We’re going to get nerdy hereThe books on this shelf should be a strong indication of what’s to comeIf you happen to be one of his arch enemies, apologies for the appearance of Wil Wheaton’s name
  • Whats the first step?
  • Ask question: Is categories it's own entity? It could be, but it's likely a property of books.
  • So this is where the fun would end in a traditional relational database. Schema design slows you down. With mongodb, you do still need to think about how you want to store and access your data effectively, but there’s no up front commitment on the developers part. We can jump right into the building it.
  • Ask question: Is categories it's own entity? It could be, but it's likely a property of books. What are some pain points of relational db schema design?
  • This doesn’t mean we don’t think about schema, it just means that we let it evolve with out application. In MongoDB schemas are flexible and based on a different idea. Schemas are about how you use the data, not about how you store the data.So what kind of collections would be build in MongoDB…
  • Point out entities and what we end up doing them. We don’t have to normalize them.Do we want to query by publishers? Or do we just want the publisher information along without books?
  • I’m sure we have developers with many different backgrounds in the room today. Finding a common language would be challenging, so we’re going to use the Mongo Shell directly to build this app.
  • What is that _id field? I didn’t add that?
  • "50804d0bd94ccab2da652599" is a 24 byte string (12 byte ObjectId hex encoded).See how easy MongoDB makes this for you? Agile development etcLets get back to our app.
  • Powerful message here. Finally a database that enables rapid & agile development.
  • Creating a book here. A few things to make note of here…Author referenceGenre (List)Publication (Embedded Document)Date (new type, why not ISODate?)How would I query on genre? How do I work with keys/document fields that might have multiple values?
  • Specify which fields are returned. Default is everything
  • It’s all the same!
  • Feels familiar, very intuitive.How about updating the book? What if I need to add something new to this object?
  • Powerful message here. Finally a database that enables rapid & agile development.
  • You can see the updated fields here.What about indexes? Right now, we only have an index on _id because MongoDB does that for us automatically.If I don’t have to create my collection ahead of time and specify a strict schema, how do I define indexes and optimize my queries?
  • 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.
  • The shell is cool and all, but how do I use MongoDB in language X?
  • Raise your hand if your language of choice is on this screen?
  • Plus community drivers. How about this one?
  • But its only the tip of the ice-berg….
  • In this room with Craig Wilson
  • Kevin Hanson
  • Hannes Magnusson
  • Yours truly.

Building Your First App: An Introduction to MongoDB Presentation Transcript

  • 1. #MongoDBDays Building Your First App: An Introduction to MongoDBBrandon BlackSoftware Engineer, 10gen@brandonmblack
  • 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. 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
  • 10. http://www.mongodb.org/downloads
  • 11. Mongo Shell
  • 12. Document Database
  • 13. RDBMS MongoDBTable, View ➜ CollectionRow ➜ DocumentIndex ➜ IndexJoin ➜ Embedded DocumentForeign Key ➜ ReferencePartition ➜ ShardTerminology
  • 14. Typical (relational) ERD
  • 15. MongoDB ERD
  • 16. Library ManagementApplication http://www.flickr.com/photos/somegeekintn/3484353131/
  • 17. First step in any application isDetermine your entities
  • 18. Library Management ApplicationEntities• Library Patrons (users)• Books (catalog)• Authors• Publishers• Categories ??
  • 19. In a relational based appWe would start by doingschema 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 wed have 5 tables and 5 join tables• Lots of revisions until we get it just right
  • 21. In a MongoDB based appWe start building ourand let the schema evolveapp
  • 22. MongoDB Collections• Users• Books• Authors• Publishers
  • 23. No Common LanguageMongo Shell
  • 24. Working with MongoDB
  • 25. Start with an Object(or array, hash, dict, etc)user = { username: fred.jones, first_name: fred, last_name: jones,}
  • 26. Insert the Record> db.users.insert(user) No collection creation needed
  • 27. Querying for the User> db.users.findOne(){ "_id" : ObjectId("50804d0bd94ccab2da652599"), "username" : "fred.jones", "first_name" : "fred", "last_name" : "jones"}
  • 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. Creating an Author> 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, was aprofessor of Anglo-Saxon at Oxford, a fellow of Pembroke College,and a fellow of Merton College until his retirement in 1959. His chiefinterest was the linguistic aspects of the early English writtentradition, but even as he studied these classics he was creating aset of his own.})
  • 31. Querying for Our Author> 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 worldas the creator of The Hobbit and The Lord of the Rings, was aprofessor of Anglo-Saxon at Oxford, a fellow of Pembroke College,and a fellow of Merton College until his retirement in 1959. His chiefinterest was the linguistic aspects of the early English writtentradition, but even as he studied these classics he was creating aset of his own."}
  • 32. Creating a Book> 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), }}) http://society6.com/PastaSoup/The-Fellowship-of-the-Ring-ZZc_Print/
  • 33. Multiple Values Per Key> db.books.findOne({language: english}, {genre: 1}){ "_id" : ObjectId("50804391d94ccab2da652598"), "genre" : [ "fantasy", "adventure" ]}
  • 34. Multiple Values Per Key> db.books.findOne({genre: fantasy}, {title: 1}){ "_id" : ObjectId("50804391d94ccab2da652598"), "title" : "fellowship of the ring, the"} Query key with single value or multiple values the same way.
  • 35. Nested Values> db.books.findOne({}, {publication: 1}){ "_id" : ObjectId("50804ec7d94ccab2da65259a"), "publication" : { "name" : "george allen & unwin", "location" : "London", "date" : ISODate("1954-07-21T04:00:00Z") }}
  • 36. Query Nested Values withDot Notation> 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") }}
  • 37. Update Books> db.books.update( {"_id" : ObjectId("50804391d94ccab2da652598")}, { $set : { isbn: 0547928211, pages: 432 } }) This is true agile development . I’m simply changing how I work with the data, and the database follows.
  • 38. Updated Book Recorddb.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"}
  • 39. Creating Indexes> db.books.ensureIndex({title: 1})> db.books.ensureIndex({genre : 1})> db.books.ensureIndex({publication.date: -1})
  • 40. Query with RegularExpressions> 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"}
  • 41. Adding More Books> 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), }}) http://society6.com/PastaSoup/The-Two-Towers-XTr_Print/
  • 42. Adding More Books> 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), }}) http://society6.com/PastaSoup/The-Return-of-the-King-Jsc_Print/
  • 43. Cursors> 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") }}
  • 44. Simple Pagerpage_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);
  • 45. Finding an Author by Book> 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 ofMerton College until his retirement in 1959. His chief interest was thelinguistic aspects of the early English written tradition, but even as hestudied these classics he was creating a set of his own."}
  • 46. MongoDB Drivers
  • 47. Real applications are notbuilt 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 nativebindings for over 12languages
  • 50. Next Steps
  • 51. Weve introduced a lot ofconcepts here
  • 52. Schema Design @ 10:35am
  • 53. Indexing @ 12:15pm
  • 54. Replication @ 1:45pm
  • 55. Sharding @ 2:30pm
  • 56. • 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
  • 57. #MongoDBDaysThank YouBrandon BlackSoftware Engineer, 10gen@brandonmblack