Your SlideShare is downloading. ×
0
#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• Doc...
Open Source• MongoDB is an open source project• On GitHub• Server licensed under AGPL• Drivers licensed under Apache• Star...
High Performance• Written in C++• Extensive use of memory-mapped files i.e. read-through write-through memory caching.• Ru...
Horizontally Scalable
Full Featured• Ad Hoc queries• Real time aggregation• Rich query capabilities• Geospatial features• Support for most progr...
http://www.mongodb.org/downloads
Mongo Shell
Document Database
RDBMS                MongoDBTable, View   ➜   CollectionRow           ➜   DocumentIndex         ➜   IndexJoin          ➜  ...
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 ...
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, ...
Insert the record> db.users.insert(user)                  No collection creation                  needed
Querying for the user> db.users.findOne(){    "_id" : ObjectId("50804d0bd94ccab2da652599"),    "username" : "fred.jones", ...
_id• _id is the primary key in MongoDB• Automatically indexed• Automatically created as an ObjectId if not provided• Any u...
ObjectId• ObjectId is a special 12 byte value• Guaranteed to be unique across your cluster• ObjectId("50804d0bd94ccab2da65...
Creating an author> db.author.insert({                       first_name: ’J.R.R.,                       last_name: ‘Tolkie...
Querying for our author> db.author.findOne( { last_name : Tolkien } ){    "_id" : ObjectId("507ffbb1d94ccab2da652597"),   ...
Creating a Book> db.books.insert({            title: ‘Fellowship of the Ring, The,            author: ObjectId("507ffbb1d9...
Multiple values per key> db.books.findOne({language: English}, {genre: 1}){    "_id" : ObjectId("50804391d94ccab2da652598"...
Querying for key withmultiple values> db.books.findOne({genre: fantasy}, {title: 1}){    "_id" : ObjectId("50804391d94ccab...
Nested Values> db.books.findOne({}, {publication: 1}){    "_id" : ObjectId("50804ec7d94ccab2da65259a"),    "publication" :...
Reach into nested valuesusing dot notation> db.books.findOne(    {publication.date :              { $lt : new Date(21 June...
Update books> db.books.update(         {"_id" :      ObjectId("50804391d94ccab2da652598")},         { $set : {            ...
The Updated Book recorddb.books.findOne(){    "_id" : ObjectId("50804ec7d94ccab2da65259a"),    "author" : ObjectId("507ffb...
Creating indexes> db.books.ensureIndex({title: 1})> db.books.ensureIndex({genre : 1})> db.books.ensureIndex({publication.d...
Querying with RegEx> db.books.findOne({title : /^Fell/}){    "_id" : ObjectId("50804ec7d94ccab2da65259a"),    "author" : O...
Adding a few more books> db.books.insert({             title: Two Towers, The,             author: ObjectId("507ffbb1d94cc...
Adding a few more books> db.books.insert({             title: Return of the King, The,             author: ObjectId("507ff...
Cursors> db.books.find({ author: ObjectId("507ffbb1d94ccab2da652597")}).sort({ publication.date : -1}).limit(1){     "_id"...
Pagingpage_num = 3;
results_per_page = 10;

cursor =db.books.find()
 .sort({ "publication.date" : -1 })
.skip((page_num - ...
Finding author by book> book = db.books.findOne(            {"title" : "Return of the King, The"})> db.author.findOne({_id...
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• D...
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              ...
Building Your First App with MongoDB
Building Your First App with MongoDB
Upcoming SlideShare
Loading in...5
×

Building Your First App with MongoDB

1,856

Published on

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.

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

No Downloads
Views
Total Views
1,856
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
38
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide
  • 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
  • Transcript of "Building Your First App with MongoDB"

    1. 1. #MongoBostonBuilding your first app:an introduction toMongoDBMike FriedmanPerl Engineer & Evangelist, 10gen
    2. 2. What is MongoDB?
    3. 3. MongoDB is a ___________database• Document• Open source• High performance• Horizontally scalable• Full featured
    4. 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. 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. 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. 7. Horizontally Scalable
    8. 8. Full Featured• Ad Hoc queries• Real time aggregation• Rich query capabilities• Geospatial features• Support for most programming languages• Flexible schema
    9. 9. http://www.mongodb.org/downloads
    10. 10. Mongo Shell
    11. 11. Document Database
    12. 12. RDBMS MongoDBTable, View ➜ CollectionRow ➜ DocumentIndex ➜ IndexJoin ➜ Embedded DocumentForeign Key ➜ ReferencePartition ➜ ShardTerminology
    13. 13. Typical (relational) ERD
    14. 14. MongoDB ERD
    15. 15. We will build a librarymanagement application http://www.flickr.com/photos/somegeekintn/3484353131/
    16. 16. First step in any application isDetermine your entities
    17. 17. Library Management ApplicationEntities• Library Patrons (users)• Books (catalog)• Authors• Publishers• Categories ??
    18. 18. In a relational based appWe would start by doingschema design
    19. 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. 20. In a MongoDB based appWe start building ourand let the schema evolveapp
    21. 21. MongoDB collections• Users• Books• Authors
    22. 22. Working with MongoDB
    23. 23. Start with an object(or array, hash, dict, etc)user = { username: fred.jones, first_name: Fred, last_name: Jones,}
    24. 24. Insert the record> db.users.insert(user) No collection creation needed
    25. 25. Querying for the user> db.users.findOne(){ "_id" : ObjectId("50804d0bd94ccab2da652599"), "username" : "fred.jones", "first_name" : "Fred", "last_name" : "Jones"}
    26. 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. 27. ObjectId• ObjectId is a special 12 byte value• Guaranteed to be unique across your cluster• ObjectId("50804d0bd94ccab2da652599") Timestamp machine PID Increment
    28. 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. 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 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."}
    30. 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. 31. Multiple values per key> db.books.findOne({language: English}, {genre: 1}){ "_id" : ObjectId("50804391d94ccab2da652598"), "genre" : [ "fantasy", "adventure" ]}
    32. 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. 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. 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. 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. 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. 37. Creating indexes> db.books.ensureIndex({title: 1})> db.books.ensureIndex({genre : 1})> db.books.ensureIndex({publication.date: -1})
    38. 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. 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. 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. 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. 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. 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. 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 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. 48. Next Steps
    49. 49. Weve introduced a lot ofconcepts here
    50. 50. Schema Design @ 10:45 am
    51. 51. Indexing/Query Optimization@ 11:40 am
    52. 52. Replication @ 1:55 pm
    53. 53. Sharding @ 2:40 pm
    54. 54. $project $unwind $groupAggregation @ 4:25 pm
    55. 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
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×