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

Building Your First App with MongoDB

on

  • 1,005 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,005
Views on SlideShare
1,005
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 Building Your First App with MongoDB Presentation Transcript

  • #MongoBostonBuilding your first app:an introduction toMongoDBMike FriedmanPerl Engineer & Evangelist, 10gen
  • What is MongoDB?
  • MongoDB is a ___________database• Document• Open source• High performance• Horizontally scalable• Full featured
  • 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.
  • 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
  • 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
  • Horizontally Scalable
  • Full Featured• Ad Hoc queries• Real time aggregation• Rich query capabilities• Geospatial features• Support for most programming languages• Flexible schema
  • http://www.mongodb.org/downloads
  • Mongo Shell
  • Document Database
  • RDBMS MongoDBTable, View ➜ CollectionRow ➜ DocumentIndex ➜ IndexJoin ➜ Embedded DocumentForeign Key ➜ ReferencePartition ➜ ShardTerminology
  • Typical (relational) ERD
  • MongoDB ERD
  • We will build a librarymanagement application http://www.flickr.com/photos/somegeekintn/3484353131/
  • First step in any application isDetermine your entities
  • Library Management ApplicationEntities• Library Patrons (users)• Books (catalog)• Authors• Publishers• Categories ??
  • In a relational based appWe would start by doingschema design
  • 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
  • In a MongoDB based appWe start building ourand let the schema evolveapp
  • MongoDB collections• Users• Books• Authors
  • Working with MongoDB
  • Start with an object(or array, hash, dict, etc)user = { username: fred.jones, first_name: Fred, last_name: Jones,}
  • Insert the record> db.users.insert(user) No collection creation needed
  • Querying for the user> db.users.findOne(){ "_id" : ObjectId("50804d0bd94ccab2da652599"), "username" : "fred.jones", "first_name" : "Fred", "last_name" : "Jones"}
  • _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
  • ObjectId• ObjectId is a special 12 byte value• Guaranteed to be unique across your cluster• ObjectId("50804d0bd94ccab2da652599") Timestamp machine PID Increment
  • 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.})
  • 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."}
  • 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/
  • Multiple values per key> db.books.findOne({language: English}, {genre: 1}){ "_id" : ObjectId("50804391d94ccab2da652598"), "genre" : [ "fantasy", "adventure" ]}
  • 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.
  • Nested Values> db.books.findOne({}, {publication: 1}){ "_id" : ObjectId("50804ec7d94ccab2da65259a"), "publication" : { "name" : "George Allen & Unwin", "location" : "London", "date" : ISODate("1954-07-21T04:00:00Z") }}
  • 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") }}
  • 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
  • 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"}
  • Creating indexes> db.books.ensureIndex({title: 1})> db.books.ensureIndex({genre : 1})> db.books.ensureIndex({publication.date: -1})
  • 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"}
  • 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/
  • 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/
  • 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") }}
  • 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);
  • 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."}
  • MongoDB Drivers
  • Real applications are notbuilt in the shell
  • MongoDB has nativebindings for over 12languages
  • 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)
  • Next Steps
  • Weve introduced a lot ofconcepts here
  • Schema Design @ 10:45 am
  • Indexing/Query Optimization@ 11:40 am
  • Replication @ 1:55 pm
  • Sharding @ 2:40 pm
  • $project $unwind $groupAggregation @ 4:25 pm
  • #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