Getting Started With
                           MongoDB and
                           Mongoose
                           { author: “Ynon Perek” }




Tuesday, February 12, 13
Whoami




                     Ynon Perek

                     http://ynonperek.com

                     ynon@ynonperek.com




Tuesday, February 12, 13
Agenda



                                Mongo Is Awesome

                                CRUD Operations

                                Mongoose

                                Coding Time




Tuesday, February 12, 13
COUC H DB             CASSANDRA



                   Part of the NoSQL Family

                                                      SIMPLEDB
                           REDIS

                                         FLOCKD
                                               B


Tuesday, February 12, 13
But Most Popular Of All




Tuesday, February 12, 13
Mongo Is Awesome



                  Data Store for
                  JSON Objects




Tuesday, February 12, 13
Mongo Is Awesome



                  Data Store for
                  JSON Objects


          {
               “Name” : “Rose Tyler”
          }




Tuesday, February 12, 13
JSON Objects


                     A JSON Object is a
                     collection of key/
                     value pairs          {
                                            "name"       : "Rose Tyler",
                     Keys are simple        "race"       : "Human",
                     strings                "body parts" : [ "head", "legs"]
                                          }
                     Values can be:
                     Numbers, Strings,
                     Arrays, Other
                     Objects, and more




Tuesday, February 12, 13
Mongo saves the data
                     in a binary format
                     called BSON

                     Spec:
                     http://bsonspec.org/




Tuesday, February 12, 13
It’s A Document Oriented Data
                 Store




Tuesday, February 12, 13
It don’t do joins




Tuesday, February 12, 13
It don’t do transactions




Tuesday, February 12, 13
Keeping It Simple




                     Document Oriented

                     No Transactions

                     No Joins




Tuesday, February 12, 13
What Can Mongo Do For You




                     Create and store objects

                     Arrange them in collections

                     Retrieve them later




Tuesday, February 12, 13
Q&A




Tuesday, February 12, 13
CRUD Operations
                           Create, Read, Update and Destroy Data


Tuesday, February 12, 13
Mongo CRUD



                     Create   is called insert

                     Read     is called find

                     Update is called update

                     Destroy is called remove




Tuesday, February 12, 13
Mongo CRUD


                     db.highscore.insert ({"name":"Tom", "score":94});

                     db.highscore.find   ({"name" : "Tom" })

                     db.highscore.update ({"name" : "Tom"},
                                          {"$inc" : { "score" : 1 } });

                     db.highscore.remove ({"name" : "Tom"});




Tuesday, February 12, 13
Mongoose
                           MongoDB + Node.JS = Awesome


Tuesday, February 12, 13
What’s That




                     An Object Relational Mapper for Node.JS

                     Handles gory details so you don’t have to

                     Fat Models




Tuesday, February 12, 13
Agenda


                     Hello Mongoose

                     Schema and Data Types

                     Custom Validators

                     Querying Data

                     Mongoose Plugins




Tuesday, February 12, 13
Online Resources




                     http://mongoosejs.com/

                     https://github.com/LearnBoost/mongoose

                     irc: #mongoosejs on freenode




Tuesday, February 12, 13
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');
             });




Tuesday, February 12, 13
Mongoose Objects


                              Schema            Schema




                      Model            Model   Model




Tuesday, February 12, 13
Mongoose Objects

            var schema = mongoose.Schema(
                          { name: String });
                                                  { name: String}


            var Cat = mongoose.model(
                         'Cat', schema);               Cat


            var kitty = new Cat(
                         { name: 'Zildjian' });        kitty




Tuesday, February 12, 13
Demo




                     Express + Node.JS +
                     Mongoose

                     Contact List App




Tuesday, February 12, 13
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                    }
                                                });




Tuesday, February 12, 13
Schema Types

                     String

                     Number

                     Date

                     Buffer

                     Boolean

                     Mixed

                     ObjectId

                     Array



Tuesday, February 12, 13
Nested Objects



                                                var PersonSchema = new Schema({
                     Creating nested objects      name: {
                                                    first: String,
                     is easy
                                                    last: String
                                                  }
                     Just assign an object as   });
                     the value




Tuesday, February 12, 13
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]
                                                });




Tuesday, February 12, 13
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
                     username




Tuesday, February 12, 13
Creating New Objects



                     Create a new object    var mypic = new Photo({
                     by instantiating the     username: 'ynon',
                                              photo: 'data:image/
                     model                  gif;base64,R0lGOD
                                            lhCwAOAMQfAP////7+',
                     Pass the values to       uploaded_at: new Date()
                     the ctor               });




Tuesday, February 12, 13
Creating New Objects




                     After the object is
                     ready, simply save it
                                             mypic.save();




Tuesday, February 12, 13
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 save




Tuesday, February 12, 13
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
                                         });
                     evaluation




Tuesday, February 12, 13
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 );
             });
              




Tuesday, February 12, 13
Schemas: Fat Models


Tuesday, February 12, 13
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;
             };
              




Tuesday, February 12, 13
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 }
           });




Tuesday, February 12, 13
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];
            });




Tuesday, February 12, 13
Q&A




Tuesday, February 12, 13
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
          });




Tuesday, February 12, 13
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 );
              });


Tuesday, February 12, 13
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] )




Tuesday, February 12, 13
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);
               });




Tuesday, February 12, 13
Mongoose Plugins




                     A plugin connects to
                     the Schema and
                     extends it in a way




Tuesday, February 12, 13
Mongoose Plugins




                     A mongoose plugin is a simple function which takes
                     schema and options

                     Demo: lastModifiedPlugin
                     https://gist.github.com/4657579




Tuesday, February 12, 13
Mongoose Plugins




                     find or create plugin:

                     https://github.com/drudge/mongoose-findorcreate




Tuesday, February 12, 13
Mongoose Plugins




                     Hashed password field plugin:
                     https://gist.github.com/4658951




Tuesday, February 12, 13
Mongoose Plugins




                     Mongoose troops is a collection of useful mongoose
                     plugins:
                     https://github.com/tblobaum/mongoose-troop




Tuesday, February 12, 13
Thanks For Listening



                     Ynon Perek

                     Slides at:
                     ynonperek.com

                     Talk to me at:
                     ynon@ynonperek.com




Tuesday, February 12, 13

Node-IL Meetup 12/2

  • 1.
    Getting Started With MongoDB and Mongoose { author: “Ynon Perek” } Tuesday, February 12, 13
  • 2.
    Whoami Ynon Perek http://ynonperek.com ynon@ynonperek.com Tuesday, February 12, 13
  • 3.
    Agenda Mongo Is Awesome CRUD Operations Mongoose Coding Time Tuesday, February 12, 13
  • 4.
    COUC H DB CASSANDRA Part of the NoSQL Family SIMPLEDB REDIS FLOCKD B Tuesday, February 12, 13
  • 5.
    But Most PopularOf All Tuesday, February 12, 13
  • 6.
    Mongo Is Awesome Data Store for JSON Objects Tuesday, February 12, 13
  • 7.
    Mongo Is Awesome Data Store for JSON Objects { “Name” : “Rose Tyler” } Tuesday, February 12, 13
  • 8.
    JSON Objects A JSON Object is a collection of key/ value pairs {   "name" : "Rose Tyler", Keys are simple   "race" : "Human", strings   "body parts" : [ "head", "legs"] } Values can be: Numbers, Strings, Arrays, Other Objects, and more Tuesday, February 12, 13
  • 9.
    Mongo saves thedata in a binary format called BSON Spec: http://bsonspec.org/ Tuesday, February 12, 13
  • 10.
    It’s A DocumentOriented Data Store Tuesday, February 12, 13
  • 11.
    It don’t dojoins Tuesday, February 12, 13
  • 12.
    It don’t dotransactions Tuesday, February 12, 13
  • 13.
    Keeping It Simple Document Oriented No Transactions No Joins Tuesday, February 12, 13
  • 14.
    What Can MongoDo For You Create and store objects Arrange them in collections Retrieve them later Tuesday, February 12, 13
  • 15.
  • 16.
    CRUD Operations Create, Read, Update and Destroy Data Tuesday, February 12, 13
  • 17.
    Mongo CRUD Create is called insert Read is called find Update is called update Destroy is called remove Tuesday, February 12, 13
  • 18.
    Mongo CRUD db.highscore.insert ({"name":"Tom", "score":94}); db.highscore.find ({"name" : "Tom" }) db.highscore.update ({"name" : "Tom"}, {"$inc" : { "score" : 1 } }); db.highscore.remove ({"name" : "Tom"}); Tuesday, February 12, 13
  • 19.
    Mongoose MongoDB + Node.JS = Awesome Tuesday, February 12, 13
  • 20.
    What’s That An Object Relational Mapper for Node.JS Handles gory details so you don’t have to Fat Models Tuesday, February 12, 13
  • 21.
    Agenda Hello Mongoose Schema and Data Types Custom Validators Querying Data Mongoose Plugins Tuesday, February 12, 13
  • 22.
    Online Resources http://mongoosejs.com/ https://github.com/LearnBoost/mongoose irc: #mongoosejs on freenode Tuesday, February 12, 13
  • 23.
    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'); }); Tuesday, February 12, 13
  • 24.
    Mongoose Objects Schema Schema Model Model Model Tuesday, February 12, 13
  • 25.
    Mongoose Objects var schema = mongoose.Schema( { name: String }); { name: String} var Cat = mongoose.model( 'Cat', schema); Cat var kitty = new Cat( { name: 'Zildjian' }); kitty Tuesday, February 12, 13
  • 26.
    Demo Express + Node.JS + Mongoose Contact List App Tuesday, February 12, 13
  • 27.
    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 } }); Tuesday, February 12, 13
  • 28.
    Schema Types String Number Date Buffer Boolean Mixed ObjectId Array Tuesday, February 12, 13
  • 29.
    Nested Objects var PersonSchema = new Schema({ Creating nested objects   name: {     first: String, is easy     last: String   } Just assign an object as }); the value Tuesday, February 12, 13
  • 30.
    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] }); Tuesday, February 12, 13
  • 31.
    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 username Tuesday, February 12, 13
  • 32.
    Creating New Objects Create a new object var mypic = new Photo({ by instantiating the   username: 'ynon',   photo: 'data:image/ model gif;base64,R0lGOD lhCwAOAMQfAP////7+', Pass the values to   uploaded_at: new Date() the ctor }); Tuesday, February 12, 13
  • 33.
    Creating New Objects After the object is ready, simply save it mypic.save(); Tuesday, February 12, 13
  • 34.
    What Schema CanDo 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 save Tuesday, February 12, 13
  • 35.
    What Schema CanDo 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 }); evaluation Tuesday, February 12, 13
  • 36.
    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 ); });   Tuesday, February 12, 13
  • 37.
  • 38.
    What Schema CanDo 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; };   Tuesday, February 12, 13
  • 39.
    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 } }); Tuesday, February 12, 13
  • 40.
    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]; }); Tuesday, February 12, 13
  • 41.
  • 42.
    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 }); Tuesday, February 12, 13
  • 43.
    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 ); }); Tuesday, February 12, 13
  • 44.
    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] ) Tuesday, February 12, 13
  • 45.
    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); }); Tuesday, February 12, 13
  • 46.
    Mongoose Plugins A plugin connects to the Schema and extends it in a way Tuesday, February 12, 13
  • 47.
    Mongoose Plugins A mongoose plugin is a simple function which takes schema and options Demo: lastModifiedPlugin https://gist.github.com/4657579 Tuesday, February 12, 13
  • 48.
    Mongoose Plugins find or create plugin: https://github.com/drudge/mongoose-findorcreate Tuesday, February 12, 13
  • 49.
    Mongoose Plugins Hashed password field plugin: https://gist.github.com/4658951 Tuesday, February 12, 13
  • 50.
    Mongoose Plugins Mongoose troops is a collection of useful mongoose plugins: https://github.com/tblobaum/mongoose-troop Tuesday, February 12, 13
  • 51.
    Thanks For Listening Ynon Perek Slides at: ynonperek.com Talk to me at: ynon@ynonperek.com Tuesday, February 12, 13