Mongoose and MongoDB 101

2,099
-1

Published on

Slides from November Phoenix MongoDB User Group

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,099
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
50
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • 20 min to here
  • Mongoose and MongoDB 101

    1. 1. MongoDB and Mongoose 101 Phoenix MongoDB Meetup November 16, 2013 Will Button @wfbutton
    2. 2. About Me • DevOps/IT/DBA for myList.com • Founder of FitMeal.me – Meal Planning • Extensive background in both development and ops, specifically in scalability and sustainability
    3. 3. MongoDB – The 10,000 foot View
    4. 4. SQL to Mongo Terminology In SQL In Mongo • Database • Database • Table • Collection • Record • Document
    5. 5. Basic CRUD Operations Users: Our dataset: firstName:{type:String}, lastName:{type:String}, userName:{type:String, unique: true}, password:{type:String}, avatar:{type:String}, position:{type:String}
    6. 6. Basic CRUD Operations Wills-MacBook-Pro:~ willbutton$ mongo MongoDB shell version: 2.2.0 connecting to: test > use myapp switched to db myapp >
    7. 7. Basic CRUD Operations “C” is for Create > db.users.insert( { firstName: "Will", lastName: "Button", username: "rekibnikufesin", password: "Password", avatar: "images/will.png", position: "CEO" } ) >
    8. 8. Basic CRUD Operations “R” is for Read > db.users.find() { "_id" : ObjectId("5282dbceca316975c21907ef"), "firstName" : "Will", "lastName" : "Button", "username" : "rekibnikufesin", "password" : "Password", "avatar" : "images/will.png", "position" : "CEO" } > db.users.findOne() { "_id" : ObjectId("5282dbceca316975c21907ef"), "firstName" : "Will", "lastName" : "Button", "username" : "rekibnikufesin", "password" : "Password", "avatar" : "images/will.png", "position" : "CEO" } > db.users.find( { firstName: "Will" } ) { "_id" : ObjectId("5282dbceca316975c21907ef"), "firstName" : "Will", "lastName" : "Button", "username" : "rekibnikufesin", "password" : "Password", "avatar" : "images/will.png", "position" : "CEO" } >
    9. 9. Basic CRUD Operations “U” is for Update > db.users.update( { firstName: "Will", lastName: "Button" }, { $set: { position: "Janitor" } } ) > > db.users.find() { "_id" : ObjectId("5282dbceca316975c21907ef"), "avatar" : "images/will.png", "firstName" : "Will", "lastName" : "Button", "password" : "Password", "position" : "Janitor", "username" : "rekibnikufesin" } > $set is your friend!
    10. 10. Basic CRUD Operations “D” is for Delete > db.users.remove( { lastName: "Button" } ) > db.users.count() 0 >
    11. 11. mongoose • MongoDB object modeling for node.js
    12. 12. Why mongoose? Let's face it, writing MongoDB validation, casting and business logic boilerplate is a drag. That's why we wrote Mongoose. var mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); var Cat = mongoose.model('Cat', { name: String }); var kitty = new Cat({ name: 'Zildjian' }); kitty.save(function (err) { if (err) // ... console.log('meow'); }); Mongoose provides a straight-forward, schema-based solution to modeling your application data and includes built-in type casting, validation, query building, business logic hooks and more, out of the box.
    13. 13. Go With The Flow: Collections Schema Model Documents Documents
    14. 14. Putting it in action: Use case: • Build a CRM application using the M.E.A.N. stack • Using Mongoose, provide basic CRUD operations inside the node stack
    15. 15. Database Schema Database: myapp Collection: users Collection: documents Collection: communications firstName lastName username password avatar position docOwner docType dateSaved description fileLocation commType date description followUpDate contact
    16. 16. Schema A schema maps to a MongoDB collection and defines the shape of the documents within that collection var userSchema = new mongoose.Schema({ firstName:{type:String}, lastName:{type:String}, userName:{type:String, unique: true}, password:{type:String}, avatar:{type:String}, position:{type:String} })
    17. 17. Models To use our schema definition, we need to convert our blogSchema into a Model we can work with app.db.model('user',userSchema) ;
    18. 18. Documents Instances of Models are Documents var user = req.app.db.model('user') ; Documents have built-in methods: var query = user.find() ; query.sort({lastName:'asc'}) ; query.exec(function(err,data){ if(err){ console.log(err); res.send(500) ; } res.json(data) ; })
    19. 19. Putting it all together Open a connection app.db = mongoose.createConnection('mongodb://localhost/myapp') ; app.db.on('error', function() { console.error.bind(console, 'mongoose connection error: '); }); app.db.once('open', function () { console.log('mongoose open for business'); });
    20. 20. Badass, Right? But that only gets us so far. Let’s explore some of the other features available to us, such as validations, sub-documents, populations
    21. 21. Queries var user = req.app.db.model('user') ; try{ var id = req.params['userId'] ; user.findOne({_id: id}, 'firstName userName', function(err,data){ console.log('find by id') ; res.json(data) ; }); } catch(e){ console.log(e); res.send(e) ; } var user = req.app.db.model('user'); // console.log(req.body) ; var newuser = new user(req.body); newuser.validate(function(error) { if (error) { res.json({ error : error }); } else { delete req.body._id ; user.findByIdAndUpdate({_id:newuser._id},{$set:req.body},function(err,data){ res.json(data) ; }) } });
    22. 22. Validations Validation is defined in the SchemaType Validation occurs when a document attempts to be saved, after defaults have been applied Validation is asynchronously recursive; when you call Model#save, sub-document validation is executed as well var user = req.app.db.model('user'); // console.log(req.body) ; var newuser = new user(req.body); newuser.validate(function(error) { if (error) { res.json({ error : error }); } else { delete req.body._id ; user.findByIdAndUpdate({_id:newuser._id},{$set:req.body},function(err,data){ res.json(data) ; }) } }); All SchemaTypes have the built in required validator. Numbers have min and max validators. Strings have enum and match validators.
    23. 23. Validations var userSchema = new mongoose.Schema({ firstName:{type:String}, lastName:{type:String}, userName:{type:String, unique: true}, password:{type:String}, avatar:{type:String}, position:{type:String} })
    24. 24. Sub-Documents Documents within documents?!?!? What is this witchcraft you speak of??? Sub-documents are documents with their own schema and are elements of a parent’s document array • All the same features as normal documents • Saved when parent document saved • Errors bubble up to parent callback
    25. 25. Sub-Documents var childSchema = new Schema({ name: 'string' }); var parentSchema = new Schema({ children: [childSchema] }) Finding a sub-document var doc = parent.children.id(id); Add with standard array methods: push, addToSet, unshift parent.children.push({ name: 'Liesl' }); Remove by id var doc = parent.children.id(id).remove();
    26. 26. Population Allows “joining” data from other collections var communicationSchema = new mongoose.Schema({ commType:{type:String}, date:{type:Date}, description:{type:String}, followUpDate:{type:Date}, owner:[{type: mongoose.Schema.Types.ObjectId, ref:'user'}] }) var userSchema = new mongoose.Schema({ firstName:{type:String}, lastName:{type:String}, userName:{type:String, unique: true}, password:{type:String}, avatar:{type:String}, position:{type:String} }) var Communication= mongoose.model(‟Comm', communicationSchema); var User= mongoose.model(‟User', userSchema);
    27. 27. Population var stevie = new User({ _id: 0, firstName: “Stevie”, lastName: “Wonder” }) stevie.save(function (err){ if (err) return handleError(err); var comm1 = new Communication({ commType: “Phone call”, description: “I just called to say I love you”, owner: stevie._id }); comm1.save(function (err){ if (err) return handleError(err); }); }) Communication .findOne({ commType: “Phone call”}) .populate(„owner‟) .exec(function (err,comm){ if(err) return handleError(err); console.log(„Call owner is %s‟, communication.owner.firstName); })
    28. 28. Thank You! • Questions • Comments • More Info
    1. A particular slide catching your eye?

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

    ×