Building Your First App with MongoDB
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Building Your First App with MongoDB

on

  • 1,047 views

This talk introduces the features of MongoDB by demonstrating how one can build a simple library application. The talk will cover the basics of MongoDB\'s document model, query language, and API.

This talk introduces the features of MongoDB by demonstrating how one can build a simple library application. The talk will cover the basics of MongoDB\'s document model, query language, and API.

Statistics

Views

Total Views
1,047
Views on SlideShare
1,047
Embed Views
0

Actions

Likes
2
Downloads
29
Comments
0

0 Embeds 0

No embeds

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
  • Welcome toMongoDB BostonMy name is Mike FriedmanScratches surface of MongoDB
  • These words do mean something
  • MongoDB server written in C++ and is fastWorking sets kept in memory as much as possibleAny OSFast serialization formatIndexingLow development time
  • Replica sets for redundancySharding for query distributionShards on top of replica sets
  • Query optimization talk (11:40 w/ Tyler Brock)Aggregation talk (4:25 w/Jeremy)Dozen 10gen-supported drivers / community driversSo where do we get MongoDB?
  • Version numberHow are we going to work with MongoDB?
  • mongod is the MongoDB daemonFirst figure out what a document database is
  • Not synonyms, but analogous
  • Does not show join tables
  • Notice square brackets on Comments, etc.CD app story
  • Ask question: Is categories it's own entity? It could be, but it's likely a property of books.
  • No "create table" – collections have no schema; all the same
  • So what collections should we make? Only need three for now
  • Now we will use the shell
  • JSON format because shell is JavaScript
  • Since all collections are the same, no need to createHow do we get it out?
  • Object ID is created automatically
  • Can not change the _id of a documentYou could delete it and create a new one
  • 4 byte signed epoch;3 bytes of MD5 hash of host16,777,216
  • Powerful message here. Finally a database that enables rapid & agile development.
  • Now we are specifying a search fieldHave user, have author, insert a book
  • Embedded array for genreEmbedded doc for publicationDate object
  • Search on languageOnly return genre_id comes back by default
  • genre is an array
  • First document empty, so finds any documentOnly returns publication embedded docCan we query fields in nested docs?
  • Nested fields with dotFirst instance of “dollar operators”How do we update?
  • Second document gives data to update/replaceDollar operator $set updates/adds individual fieldsOtherwise update takes a whole document to replace
  • MongoDB documents behave like arbitrary hashes/maps in your programming languageHow do we deal with getting big?
  • -1 means descendingIndexing/Query opt Tyler @ 11:40am
  • Let's add more
  • Creating a book here. A few things to make note of.
  • Redundant publication stuff
  • Author query returns cursor; RoTK most recentWhat else w/cursors?
  • Skip 20Results 21-30
  • Official 10gen drivers
  • Community driversProlog, D, ColdFusion, R, MatlabMore than shown here
  • MongoDB is different Evaluate tools by being educated
  • Schema Design @10:45 with Chad, Solution Architect
  • Indexing @11:40 with Tyler, Ruby driver devIndexing is essential for mission-critical apps with large data requirements
  • Repl @ 1:55 with Steve, head of Evangelism Replication is essential for redundancy
  • Shard @ 2:40 with Jared, Dir of Product MarketingSharding is essential for fast access
  • Aggregation @4:25 with Jeremy, Drivers, PHP

Building Your First App with MongoDB Presentation Transcript

  • 1. #MongoBostonBuilding your first app:an introduction toMongoDBMike FriedmanPerl Engineer & Evangelist, 10gen
  • 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 == Perl Hash• Document == Python Dict• Document == Ruby Hash• etc.
  • 5. Open Source• MongoDB is an open source project• On GitHub• Server licensed under AGPL• Drivers licensed under Apache• 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• Geospatial features• Support for most programming languages• Flexible schema
  • 9. http://www.mongodb.org/downloads
  • 10. Mongo Shell
  • 11. Document Database
  • 12. RDBMS MongoDBTable, View ➜ CollectionRow ➜ DocumentIndex ➜ IndexJoin ➜ Embedded DocumentForeign Key ➜ ReferencePartition ➜ ShardTerminology
  • 13. Typical (relational) ERD
  • 14. MongoDB ERD
  • 15. We will build a librarymanagement application http://www.flickr.com/photos/somegeekintn/3484353131/
  • 16. First step in any application isDetermine your entities
  • 17. Library Management ApplicationEntities• Library Patrons (users)• Books (catalog)• Authors• Publishers• Categories ??
  • 18. In a relational based appWe would start by doingschema design
  • 19. 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
  • 20. In a MongoDB based appWe start building ourand let the schema evolveapp
  • 21. MongoDB collections• Users• Books• Authors
  • 22. Working with MongoDB
  • 23. Start with an object(or array, hash, dict, etc)user = { username: fred.jones, first_name: Fred, last_name: Jones,}
  • 24. Insert the record> db.users.insert(user) No collection creation needed
  • 25. Querying for the user> db.users.findOne(){ "_id" : ObjectId("50804d0bd94ccab2da652599"), "username" : "fred.jones", "first_name" : "Fred", "last_name" : "Jones"}
  • 26. _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
  • 27. ObjectId• ObjectId is a special 12 byte value• Guaranteed to be unique across your cluster• ObjectId("50804d0bd94ccab2da652599") Timestamp machine PID Increment
  • 28. 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 PembrokeCollege, and a fellow of Merton College until his retirement in 1959.His chief interest was the linguistic aspects of the early Englishwritten tradition, but even as he studied these classics he wascreating a set of his own.})
  • 29. 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 theworld as the creator of The Hobbit and The Lord of the Rings, was aprofessor of Anglo-Saxon at Oxford, a fellow of PembrokeCollege, and a fellow of Merton College until his retirement in 1959.His chief interest was the linguistic aspects of the early Englishwritten tradition, but even as he studied these classics he wascreating a set of his own."}
  • 30. 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/
  • 31. Multiple values per key> db.books.findOne({language: English}, {genre: 1}){ "_id" : ObjectId("50804391d94ccab2da652598"), "genre" : [ "fantasy", "adventure" ]}
  • 32. Querying for key withmultiple values> 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.
  • 33. Nested Values> db.books.findOne({}, {publication: 1}){ "_id" : ObjectId("50804ec7d94ccab2da65259a"), "publication" : { "name" : "George Allen & Unwin", "location" : "London", "date" : ISODate("1954-07-21T04:00:00Z") }}
  • 34. Reach into nested valuesusing dot 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") }}
  • 35. Update books> db.books.update( {"_id" : ObjectId("50804391d94ccab2da652598")}, { $set : { isbn: 0547928211, pages: 432 } }) True agile development . Simply change how you work with the data and the database follows
  • 36. The 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"}
  • 37. Creating indexes> db.books.ensureIndex({title: 1})> db.books.ensureIndex({genre : 1})> db.books.ensureIndex({publication.date: -1})
  • 38. Querying with RegEx> 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"}
  • 39. Adding a few 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/
  • 40. Adding a few 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/
  • 41. 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") }}
  • 42. Pagingpage_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);
  • 43. Finding 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."}
  • 44. MongoDB Drivers
  • 45. Real applications are notbuilt in the shell
  • 46. MongoDB has nativebindings for over 12languages
  • 47. MongoDB drivers• Official Support for 12 languages• Community drivers for tons more• Drivers connect to MongoDB servers• Drivers translate BSON into native types• MongoDB shell is not a driver, but works like one in some ways• Installed using typical means (npm, cpan, gem, pip)
  • 48. Next Steps
  • 49. Weve introduced a lot ofconcepts here
  • 50. Schema Design @ 10:45 am
  • 51. Indexing/Query Optimization@ 11:40 am
  • 52. Replication @ 1:55 pm
  • 53. Sharding @ 2:40 pm
  • 54. $project $unwind $groupAggregation @ 4:25 pm
  • 55. #MongoBoston Schema Design @ 10:45 am Indexing @ 11:40 am Replication @ 1:55 pm Sharding @ 2:40 pm Aggregation @ 4:25 pmQuestions?Mike FriedmanPerl Engineer & Evangelist, 10gen