Getting Started With MongoDB and Mongoose

  • 11,939 views
Uploaded on

MongoDB and Mongoose Introduction

MongoDB and Mongoose Introduction

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
11,939
On Slideshare
0
From Embeds
0
Number of Embeds
10

Actions

Shares
Downloads
462
Comments
0
Likes
13

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Getting Started With MongoDB { author: “Ynon Perek” }Thursday, January 31, 13
  • 2. Whoami Ynon Perek http://ynonperek.com ynon@ynonperek.comThursday, January 31, 13
  • 3. Agenda MongoDB Overview Mongo Test Drive Mongo Data Model CRUD Operations Working With FilesThursday, January 31, 13
  • 4. MongoDB Overview Data Store for JSON ObjectsThursday, January 31, 13
  • 5. MongoDB Overview Data Store for JSON Objects { “Name” : “Rose Tyler” }Thursday, January 31, 13
  • 6. JSON Objects A JSON Object is a collection of key/value pairs Keys are simple strings Values can be: Numbers, Strings, Arrays, Other Objects, and moreThursday, January 31, 13
  • 7. JSON Examples { “name”: “The Doctor”, “age”: 900 } { “race”: “human”, “body parts” : [“head”, “legs”, “arms”, “eyes”] }Thursday, January 31, 13
  • 8. MongoDB Overview A Document Oriented Database (No SQL)Thursday, January 31, 13
  • 9. Keeping It SimpleThursday, January 31, 13
  • 10. Keeping It Simple No Transactions No JoinsThursday, January 31, 13
  • 11. Application Architecture SERVER DBThursday, January 31, 13
  • 12. Application Architecture DB SERVER DB DBThursday, January 31, 13
  • 13. What Can Mongo Do For You Create and store objects Arrange them in collections Retrieve them laterThursday, January 31, 13
  • 14. Q&AThursday, January 31, 13
  • 15. Mongo Test Drive Create MongoLab Account And Start Using The DBThursday, January 31, 13
  • 16. Install mongo Client Download mongo from: http://www.mongodb.org/downloads Extract zip file Run mongoThursday, January 31, 13
  • 17. Install mongo Client Choose production release for your architectureThursday, January 31, 13
  • 18. Install mongo Client Note: Still using Windows XP ? You’ll have to use the previous 2.0 versionThursday, January 31, 13
  • 19. Meet MongoLabThursday, January 31, 13
  • 20. Database DashboardThursday, January 31, 13
  • 21. Create New Database Choose database name Choose provider Choose plan (free is good) Create a DB userThursday, January 31, 13
  • 22. Database DashboardThursday, January 31, 13
  • 23. Connecting To The DB There are two options to work with your new DB You can use the web console You can use the command line console Let’s start with the web.Thursday, January 31, 13
  • 24. Demo: Creating Documents Create a few documents on the web console Update the data Delete some of them Search by fieldsThursday, January 31, 13
  • 25. Mongo Data Model Let’s model A blog post in a blog app What’s The Data ? How Should You Save It ?Thursday, January 31, 13
  • 26. Cool MongoDB Design { “title”: “Mongo 101”, “author” : “ynonp”, “comments” : [ { “author” : “...”, “content” : “...” }, { “author” : “...”, “content” : “...” } ], “tags” : [ “funny”, “informative”], “content” : “...” }Thursday, January 31, 13
  • 27. Q&AThursday, January 31, 13
  • 28. Lab Create a DB for musical info Create a collection called albums Add info for 3 albums you like, including: Album Name, Artist, Tracks, Release Date, Genres Tracks is an array of objects Genres is an array of stringsThursday, January 31, 13
  • 29. CRUD Operations Create, Read, Update and Destroy DataThursday, January 31, 13
  • 30. Mongo CRUD Create is called insert Read is called find Update is called update Destroy is called removeThursday, January 31, 13
  • 31. Mongo CRUD From a developer’s perspective, MongoDB operations are the same through the driver and through the console In both cases, operations look like function calls or method invocations We’ll use mongo shell for the rest of this chapterThursday, January 31, 13
  • 32. Inserting Data Use the command insert or save to insert a new object db.collection.insert( obj ); db.collection.insert( array );Thursday, January 31, 13
  • 33. Inserting Data Inserting to a new collection creates the collection Inserting an object with an _id key, it is used as the object’s id (and must be unique).Thursday, January 31, 13
  • 34. Reading Data find and findOne perform read operations Both take a query find returns a cursor findOne returns an object Optional: Fields to fetch db.collection.find( <query>, <projection> )Thursday, January 31, 13
  • 35. Query Document An empty (or missing) query document returns everything db.collection.find({}) db.collection.find()Thursday, January 31, 13
  • 36. Query Document Each key/value pair in the query document imposes a condition on the results (objects that match). db.movies.find({ “genre” : “indie” }); db.books.find({“pages” : { “$gt” : 100 }});Thursday, January 31, 13
  • 37. Query Document Query Object Each key/value pair in the query document imposes a condition on the results (objects that match). db.movies.find({ “genre” : “indie” }); db.books.find({“pages” : { “$gt” : 100 }});Thursday, January 31, 13
  • 38. Query Document A compound query means a logical AND on the conditions. db.inventory.find( { “type” : “snacks”, “available” : { “$lt” : 10 } });Thursday, January 31, 13
  • 39. Quiz: What Is Returned from alterego publisher Bruce { Earth DC Wayne “publisher” : “DC” } Peter Earth Marvel Parker Krypton Clark Kent DCThursday, January 31, 13
  • 40. Quiz: What Is Returned from alterego publisher { Bruce “publisher” : Earth DC Wayne “DC”, “from” : “Earth” Peter Earth Marvel } Parker Krypton Clark Kent DCThursday, January 31, 13
  • 41. More Queries You can use “$or” to have an OR expression { “$or” : [ { “type” : “food” }, { “type” : “drinks” } ] }Thursday, January 31, 13
  • 42. Sub Documents If your document has sub-documents, it’s possible to query by a full sub document or look for a partial match Full sub-document query means subdocument is exactly as specified in the query Example: { ISBN : { “ISBN-10” : “1906465592”, “ISBN-13” : “978-1906465599” }}Thursday, January 31, 13
  • 43. Sub Documents A partial query matches all objects that have at least the required field (but may contain more) Example: { “language.primary” : “english” } Value of language is an object, and it has a field called primaryThursday, January 31, 13
  • 44. Arrays You can use an exact array match by providing the full array in the query Example: { tags : [ “funny”, “cute”, “cats” ] }Thursday, January 31, 13
  • 45. Arrays You can query for an array that has at least one element matching the query Example: { “tags” : “funny” }Thursday, January 31, 13
  • 46. Arrays If you have a subdocument as the element of an array, it’s possible to query by its fields using the dot notation. Examples: { “tracks.4.name” : “Rose Mary Stretch” } { “tracks.name” : “Rose Mary Stretch” }Thursday, January 31, 13
  • 47. Query Operators Complex queries are performed with special operators. These are reserved words starting with a $ Some of them: $gt, $gte, $lt, $lte, $ne, $in, $nin, $all, $or, $notThursday, January 31, 13
  • 48. Comparator Queries Value for key a is greater than 10 { “a” : { “$gt” : 10 }} Value for key b is not 7 { “b” : { “$ne” : 7 }} Value for key name is greater (dictionary sort) than ‘bird’ { “name” : { “$gt” : “bird” }}Thursday, January 31, 13
  • 49. Queries: $in, $nin Use $in to specify a choice from multiple options Value for grade is 85, 90 or 100 { “grade” : { “$in” : [ 85, 90, 100 ] } } Value for fruit is neither apple nor banana { “fruit” : { “$nin” : [“apple”, “banana” ] } }Thursday, January 31, 13
  • 50. Quiz: What Is Selected { “reads” : { “$gt” : 10 }, “author” : { “$nin” : [“admin”, “manager”, “boss” ] } } author reads title How To Use admin 99 Mongo How To Make Joe 120 Money Windows Jim 8 ManualThursday, January 31, 13
  • 51. Queries: $all Select objects with array containing all elements Example: { “tags” : { “$all” : [ “funny”, “cats” ] } }Thursday, January 31, 13
  • 52. More Query Operators “$size” - array has a specific number of elements “$exists” - field present or missing Example: { “friends” : { “$size” : 7 } } { “producer” : { “$exists” : false } }Thursday, January 31, 13
  • 53. Aggregation count() - returns how many objects found distinct() - returns all distinct values for a key Example: db.posts.distinct( “tags” )Thursday, January 31, 13
  • 54. Resources Queries Cheat Sheet http://www.10gen.com/sites/default/files/downloads/ mongodb_qrc_queries.pdfThursday, January 31, 13
  • 55. Q&AThursday, January 31, 13
  • 56. Lab Using the previously defined musical DB. Query for: Albums released after/before 2008 Albums with 7 tracks Albums by a specific genre Albums by a specific track name Display ALL different genres in the DBThursday, January 31, 13
  • 57. Update Update operations modify existing data in the DB Mongo supports two update commands: update() and save() Update is the more general (and complex)Thursday, January 31, 13
  • 58. Update The general form for update is: db.collection.update( <query>, <update>, <options> ) Which Entries What to do with to update themThursday, January 31, 13
  • 59. Update The second argument to update() is an operator object It tells update what to do with the data Some keys you can use: “$set”, “$inc” “$push”, “$pushAll”, “$addToSet”, “$pop”, “$pull”, “$pullAll”Thursday, January 31, 13
  • 60. Update: set $set modifies a value or add a new value Example: db.posts.update( { title: “Why Is Your Cat Unhappy” }, { $set : { “archived” : true } } );Thursday, January 31, 13
  • 61. Quiz: $set What happens here ? db.cats.update( { color: “white” }, { “$set” : { “owners” : [“John”, “Jim”] } } );Thursday, January 31, 13
  • 62. Quiz: $set Update owners array of the first cat with white color If you want to update all objects, use multi db.cats.update( { color: “white” }, { “$set” : { “owners” : [“John”, “Jim”] } } { multi : true } );Thursday, January 31, 13
  • 63. Update: inc $inc increases a numeric value Example: { “$inc” : { “age” : 11 } }Thursday, January 31, 13
  • 64. Quiz: $inc What happens here ? db.songs.update( { “title” : “Killing Lies” }, { “$inc” : { “plays” : 1 } } );Thursday, January 31, 13
  • 65. Update: push and pushAll push() and pushAll() add items to an existing array If they array did not exists, it is created Example: db.creatures.update( { name: “The Doctor” }, { “$push” : { companions : “Rose Tyler” } } )Thursday, January 31, 13
  • 66. Update: addToSet The $addToSet adds a new item only if it wasn’t already in the array Example: { “$addToSet” : { “tags” : “funny” } }Thursday, January 31, 13
  • 67. Update: pop pop removes items of an array Use a value of 1 to remove the last element Use a value of -1 to remove the first element Example: { “$pop” : { “companions” : 1 } }Thursday, January 31, 13
  • 68. Update: pull Remove a specific item from an array. Can use $pullAll to remove all matching elements Example: { “$pull” : { “companions” : “Rose Tyler” } }Thursday, January 31, 13
  • 69. Updating with save() The second update operation is save() takes a document: If the document has an id - update it If not, insert it to the DBThursday, January 31, 13
  • 70. Deleting Data remove() deletes objects from a collection Takes a query and possibly a <justOne> arguments Examples: db.posts.remove({ “author” : “Father Angelo” }) db.music.remove({ “genres” : “pop” }) db.posts.remove({ “tags” : “funny” }, 1 );Thursday, January 31, 13
  • 71. Q&AThursday, January 31, 13
  • 72. Lab From the previous music database: Add a new album with 4 tracks Add a new track to that new album Set property “plays” on all albums to 6 Increase it by 4 only for “indie” albums Delete all “indie” musicThursday, January 31, 13
  • 73. Mongoose MongoDB + Node.JSThursday, January 31, 13
  • 74. What’s That An Object Relational Mapper for Node.JS Handles gory details so you don’t have to Fat ModelsThursday, January 31, 13
  • 75. Agenda Hello Mongoose Schema and Data Types Custom Validators Querying Data Poor Man’s Joins (Populate) Mongoose PluginsThursday, January 31, 13
  • 76. Online Resources http://mongoosejs.com/ https://github.com/LearnBoost/mongoose http://www.youtube.com/watch?v=4fQsDiioj3I irc: #mongoosejs on freenodeThursday, January 31, 13
  • 77. Hello Mongoose var mongoose = require(mongoose); mongoose.connect(localhost, test); var schema = mongoose.Schema({ name: string }); var Cat = mongoose.model(Cat, schema); var kitty = new Cat({ name: Zildjian }); kitty.save(function (err) { if (err) // ... console.log(meow); });Thursday, January 31, 13
  • 78. Mongoose Objects Schema Schema Model Model ModelThursday, January 31, 13
  • 79. Mongoose Objects var mongoose = require(mongoose); mongoose.connect(localhost, test); { name: String} var schema = mongoose.Schema( { name: string }); Cat var Cat = mongoose.model( Cat, schema); var kitty = new Cat( kitty { name: Zildjian });Thursday, January 31, 13
  • 80. Schema Definitions new Schema({ title: String, A schema takes a body: String, description object date: Date, which specifies its keys hidden: Boolean, and their types meta: { votes: Number, Types are mostly favs: Number normal JS } });Thursday, January 31, 13
  • 81. Schema Types String Number Date Buffer Boolean Mixed ObjectId ArrayThursday, January 31, 13
  • 82. Nested Objects var PersonSchema = new Schema({ Creating nested objects   name: {     first: String, is easy     last: String   } Just assign an object as }); the valueThursday, January 31, 13
  • 83. Array Fields var PersonSchema = new Schema({ Array fields are easy   name: {     first: String,     last: String Just write the type as a   }, single array element   hobbies: [String] });Thursday, January 31, 13
  • 84. Schema Use Case Let’s start writing a photo taking app var PhotoSchema = new Schema({   username: String, Each photo is saved   photo: String, in the DB as a Data   uploaded_at: Date URL });   var Photo = mongoose.model( Along with the Photo, PhotoSchema); photo we’ll save the usernameThursday, January 31, 13
  • 85. Creating New Objects Create a new object by instantiating the var mypic = new Photo({   username: ynon, model   photo: foo,   uploaded_at: new Date() Pass the values to }); the ctorThursday, January 31, 13
  • 86. Creating New Objects After the object is ready, simply save it mypic.save();Thursday, January 31, 13
  • 87. What Schema Can Do For You Add validations on var PhotoSchema = new Schema({ the fields   username: { type: String, required: true }, Stock validators:   photo: { type: String, required: true }, required, min, max   uploaded_at: Date Can also create }); custom validators Validation happens on saveThursday, January 31, 13
  • 88. What Schema Can Do For You Provide default var PhotoSchema = new Schema({ values for fields   username: { type: String, required: true }, Can use a   photo: function as { type: String, required: true }, default for   uploaded_at: { type: Date, default: Date.now } delayed }); evaluationThursday, January 31, 13
  • 89. What Schema Can Do For You Add methods to your documents var EvilZombieSchema = new Schema({   name: String,   brainz: { type: Number, default: 0 } });   EvilZombieSchema.methods.eat_brain = function() {   this.brainz += 1; };  Thursday, January 31, 13
  • 90. Custom Validators It’s possible to use your own validation code var toySchema = new Schema({   color: String,   name: String });   toySchema.path(color).validate(function(value) {   return ( this.color.length % 3 === 0 ); });  Thursday, January 31, 13
  • 91. Schema Create Indices A schema can have some fields marked as “index”. The collection will be indexed by them automatically var PhotoSchema = new Schema({   username: { type: String, required: true, index: true },   photo: { type: String, required: true },   uploaded_at: { type: Date, default: Date.now } });Thursday, January 31, 13
  • 92. Schemas Create Accessors A virtual field is not saved in the DB, but calculated from existing fields. “full-name” is an example. personSchema.virtual(name.full).get(function () { return this.name.first + + this.name.last; }); personSchema.virtual(name.full).set(function (name) { var split = name.split( ); this.name.first = split[0]; this.name.last = split[1]; });Thursday, January 31, 13
  • 93. Q&AThursday, January 31, 13
  • 94. Querying Data Use Model#find / Model#findOne to query data // executes immediately, passing results to callback MyModel.find({ name: john, age: { $gte: 18 }}, function (err, docs) { // do something with data // or handle err });Thursday, January 31, 13
  • 95. Querying Data You can also chain queries by not passing a callback Pass the callback at the end using exec var p = Photo.find({username: ynon}).   skip(10).   limit(5).   exec(function(err, docs) {   console.dir( docs ); });Thursday, January 31, 13
  • 96. Other Query Methods find( cond, [fields], [options], [cb] ) findOne ( cond, [fields], [options], [cb] ) findById ( id, [fields], [options], [cb] ) findOneAndUpdate( cond, [update], [options], [cb] ) findOneAndRemove( cond, [options], [cb] )Thursday, January 31, 13
  • 97. Counting Matches Use count to discover how many matching documents are in the DB Adventure.count({ type: jungle }, function (err, count) { if (err) .. console.log(there are %d jungle adventures, count); });Thursday, January 31, 13
  • 98. Lab Create a Schema called “Album” Add fields: artist, year, tracks Create a model and a document Add validator for year Save it in the DBThursday, January 31, 13
  • 99. Lab Create 5 albums from years 2008, 2009, 2010, 2011, 2012 Query the 3 newest albums Print the artist name and the number of tracks Print the artist who has the most albumsThursday, January 31, 13
  • 100. Populating Collections Mongo has no joins Let’s Fake ThemThursday, January 31, 13
  • 101. Start With Relationships Execute the following to create an initial relationship https://gist.github.com/4657446 Watch the data in the DB: Album.artist = ObjectId("5106b6e6fde8310000000001")Thursday, January 31, 13
  • 102. Use Query#populate query#populate sends another query for the related object Album.findOne().exec(function(err, doc) {   // prints undefined   console.log( doc.artist.name ); });     Album.findOne().populate(artist).exec(function(err, doc) {   // prints Pink Floyd   console.log( doc.artist.name ); });Thursday, January 31, 13
  • 103. Use Query#populate Full method signature: Query#populate( path, [fields], [model], [cond], [options] ) cond is a query condition object ( i.e. { age: { $gte: 21 }} options is a query options object ( i.e. { limit: 5 } Helps when populating arraysThursday, January 31, 13
  • 104. Mongoose Plugins A plugin connects to the Schema and extends it in a wayThursday, January 31, 13
  • 105. Mongoose Plugins A mongoose plugin is a simple function which takes schema and options Demo: lastModifiedPlugin https://gist.github.com/4657579Thursday, January 31, 13
  • 106. Mongoose Plugins find or create plugin: https://github.com/drudge/mongoose-findorcreateThursday, January 31, 13
  • 107. Mongoose Plugins Hashed password field plugin: https://gist.github.com/4658951Thursday, January 31, 13
  • 108. Mongoose Plugins Mongoose troops is a collection of useful mongoose plugins: https://github.com/tblobaum/mongoose-troopThursday, January 31, 13
  • 109. Thank You Photos from: http://123rf.com Slides available at: http://ynonperek.comThursday, January 31, 13