SlideShare ist ein Scribd-Unternehmen logo
1 von 30
MongoDB and Mongoose 101
Phoenix MongoDB Meetup
November 16, 2013
Will Button @wfbutton
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
MongoDB – The 10,000 foot View
SQL to Mongo Terminology
In SQL

In Mongo

• Database

• Database

• Table

• Collection

• Record

• Document
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}
Basic CRUD Operations

Wills-MacBook-Pro:~ willbutton$ mongo
MongoDB shell version: 2.2.0
connecting to: test
> use myapp
switched to db myapp
>
Basic CRUD Operations
“C” is for Create

> db.users.insert( { firstName: "Will", lastName: "Button", username: "rekibnikufesin", password: "Password", avatar:
"images/will.png", position: "CEO" } )
>
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" }
>
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!
Basic CRUD Operations
“D” is for Delete

> db.users.remove( { lastName: "Button" } )
> db.users.count()
0
>
mongoose
• MongoDB object modeling for node.js
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.
Go With The Flow:
Collections

Schema

Model

Documents

Documents
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
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
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}
})
Models
To use our schema definition, we need to convert our blogSchema into a Model we
can work with

app.db.model('user',userSchema) ;
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) ;
})
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');
});
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
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) ;
})
}
});
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.
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}
})
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
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();
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);
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);
})
Thank You!
• Questions
• Comments
• More Info

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Angular Introduction By Surekha Gadkari
Angular Introduction By Surekha GadkariAngular Introduction By Surekha Gadkari
Angular Introduction By Surekha Gadkari
 
Vue js for beginner
Vue js for beginner Vue js for beginner
Vue js for beginner
 
Angular 10 course_content
Angular 10 course_contentAngular 10 course_content
Angular 10 course_content
 
Introduction to AngularJS
Introduction to AngularJSIntroduction to AngularJS
Introduction to AngularJS
 
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
 
introduction to Vue.js 3
introduction to Vue.js 3 introduction to Vue.js 3
introduction to Vue.js 3
 
Angular 2 observables
Angular 2 observablesAngular 2 observables
Angular 2 observables
 
Clean backends with NestJs
Clean backends with NestJsClean backends with NestJs
Clean backends with NestJs
 
Angular Observables & RxJS Introduction
Angular Observables & RxJS IntroductionAngular Observables & RxJS Introduction
Angular Observables & RxJS Introduction
 
Basic Concept of Node.js & NPM
Basic Concept of Node.js & NPMBasic Concept of Node.js & NPM
Basic Concept of Node.js & NPM
 
Angular & RXJS: examples and use cases
Angular & RXJS: examples and use casesAngular & RXJS: examples and use cases
Angular & RXJS: examples and use cases
 
Nestjs MasterClass Slides
Nestjs MasterClass SlidesNestjs MasterClass Slides
Nestjs MasterClass Slides
 
Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.
 
Angular and The Case for RxJS
Angular and The Case for RxJSAngular and The Case for RxJS
Angular and The Case for RxJS
 
Introduction to RxJS
Introduction to RxJSIntroduction to RxJS
Introduction to RxJS
 
Broadleaf Presents Thymeleaf
Broadleaf Presents ThymeleafBroadleaf Presents Thymeleaf
Broadleaf Presents Thymeleaf
 
Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2
 
Introduction to Angularjs
Introduction to AngularjsIntroduction to Angularjs
Introduction to Angularjs
 
Node js Modules and Event Emitters
Node js Modules and Event EmittersNode js Modules and Event Emitters
Node js Modules and Event Emitters
 
Angular Best Practices - Perfomatix
Angular Best Practices - PerfomatixAngular Best Practices - Perfomatix
Angular Best Practices - Perfomatix
 

Ähnlich wie Mongoose and MongoDB 101

Webinar: Build an Application Series - Session 2 - Getting Started
Webinar: Build an Application Series - Session 2 - Getting StartedWebinar: Build an Application Series - Session 2 - Getting Started
Webinar: Build an Application Series - Session 2 - Getting Started
MongoDB
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDB
MongoDB
 

Ähnlich wie Mongoose and MongoDB 101 (20)

Scalable web application architecture
Scalable web application architectureScalable web application architecture
Scalable web application architecture
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New Tricks
 
Back to Basics 2017: Mí primera aplicación MongoDB
Back to Basics 2017: Mí primera aplicación MongoDBBack to Basics 2017: Mí primera aplicación MongoDB
Back to Basics 2017: Mí primera aplicación MongoDB
 
Node js crash course session 5
Node js crash course   session 5Node js crash course   session 5
Node js crash course session 5
 
MongoDB Days UK: Building Apps with the MEAN Stack
MongoDB Days UK: Building Apps with the MEAN StackMongoDB Days UK: Building Apps with the MEAN Stack
MongoDB Days UK: Building Apps with the MEAN Stack
 
Webinar: Build an Application Series - Session 2 - Getting Started
Webinar: Build an Application Series - Session 2 - Getting StartedWebinar: Build an Application Series - Session 2 - Getting Started
Webinar: Build an Application Series - Session 2 - Getting Started
 
Back to Basics, webinar 2: La tua prima applicazione MongoDB
Back to Basics, webinar 2: La tua prima applicazione MongoDBBack to Basics, webinar 2: La tua prima applicazione MongoDB
Back to Basics, webinar 2: La tua prima applicazione MongoDB
 
MongoDB hearts Django? (Django NYC)
MongoDB hearts Django? (Django NYC)MongoDB hearts Django? (Django NYC)
MongoDB hearts Django? (Django NYC)
 
Webinar: What's new in the .NET Driver
Webinar: What's new in the .NET DriverWebinar: What's new in the .NET Driver
Webinar: What's new in the .NET Driver
 
MongoDB Days Silicon Valley: Building Applications with the MEAN Stack
MongoDB Days Silicon Valley: Building Applications with the MEAN StackMongoDB Days Silicon Valley: Building Applications with the MEAN Stack
MongoDB Days Silicon Valley: Building Applications with the MEAN Stack
 
Sencha Touch - Introduction
Sencha Touch - IntroductionSencha Touch - Introduction
Sencha Touch - Introduction
 
Document Validation in MongoDB 3.2
Document Validation in MongoDB 3.2Document Validation in MongoDB 3.2
Document Validation in MongoDB 3.2
 
Evolving your Data Access with MongoDB Stitch - Drew Di Palma
Evolving your Data Access with MongoDB Stitch - Drew Di PalmaEvolving your Data Access with MongoDB Stitch - Drew Di Palma
Evolving your Data Access with MongoDB Stitch - Drew Di Palma
 
Building HTTP API's with NodeJS and MongoDB
Building HTTP API's with NodeJS and MongoDBBuilding HTTP API's with NodeJS and MongoDB
Building HTTP API's with NodeJS and MongoDB
 
Tame Accidental Complexity with Ruby and MongoMapper
Tame Accidental Complexity with Ruby and MongoMapperTame Accidental Complexity with Ruby and MongoMapper
Tame Accidental Complexity with Ruby and MongoMapper
 
Angular JS2 Training Session #1
Angular JS2 Training Session #1Angular JS2 Training Session #1
Angular JS2 Training Session #1
 
MongoDB .local London 2019: Fast Machine Learning Development with MongoDB
MongoDB .local London 2019: Fast Machine Learning Development with MongoDBMongoDB .local London 2019: Fast Machine Learning Development with MongoDB
MongoDB .local London 2019: Fast Machine Learning Development with MongoDB
 
MongoDB .local London 2019: Fast Machine Learning Development with MongoDB
MongoDB .local London 2019: Fast Machine Learning Development with MongoDBMongoDB .local London 2019: Fast Machine Learning Development with MongoDB
MongoDB .local London 2019: Fast Machine Learning Development with MongoDB
 
MongoDB World 2016: From the Polls to the Trolls: Seeing What the World Think...
MongoDB World 2016: From the Polls to the Trolls: Seeing What the World Think...MongoDB World 2016: From the Polls to the Trolls: Seeing What the World Think...
MongoDB World 2016: From the Polls to the Trolls: Seeing What the World Think...
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDB
 

Mehr von Will Button

Mehr von Will Button (9)

Build an Infra Product with AWS Fargate
Build an Infra Product with AWS FargateBuild an Infra Product with AWS Fargate
Build an Infra Product with AWS Fargate
 
DevOps for Developers
DevOps for DevelopersDevOps for Developers
DevOps for Developers
 
Deploy Nodejs on Docker
Deploy Nodejs on DockerDeploy Nodejs on Docker
Deploy Nodejs on Docker
 
Effective Telepresence and Remote Collaboration
Effective Telepresence and Remote CollaborationEffective Telepresence and Remote Collaboration
Effective Telepresence and Remote Collaboration
 
Traxticsearch
TraxticsearchTraxticsearch
Traxticsearch
 
No More Mr. Nice Guy The MEAN Stack
No More Mr. Nice Guy   The MEAN StackNo More Mr. Nice Guy   The MEAN Stack
No More Mr. Nice Guy The MEAN Stack
 
Practical MongoDB
Practical MongoDBPractical MongoDB
Practical MongoDB
 
Mongo Sharding: Case Study
Mongo Sharding: Case StudyMongo Sharding: Case Study
Mongo Sharding: Case Study
 
Mongo db mug_2012-02-07
Mongo db mug_2012-02-07Mongo db mug_2012-02-07
Mongo db mug_2012-02-07
 

Kürzlich hochgeladen

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Kürzlich hochgeladen (20)

Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 

Mongoose and MongoDB 101

  • 1. MongoDB and Mongoose 101 Phoenix MongoDB Meetup November 16, 2013 Will Button @wfbutton
  • 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. MongoDB – The 10,000 foot View
  • 4. SQL to Mongo Terminology In SQL In Mongo • Database • Database • Table • Collection • Record • Document
  • 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. Basic CRUD Operations Wills-MacBook-Pro:~ willbutton$ mongo MongoDB shell version: 2.2.0 connecting to: test > use myapp switched to db myapp >
  • 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. 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. 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. Basic CRUD Operations “D” is for Delete > db.users.remove( { lastName: "Button" } ) > db.users.count() 0 >
  • 11. mongoose • MongoDB object modeling for node.js
  • 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. Go With The Flow: Collections Schema Model Documents Documents
  • 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
  • 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. 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. 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. 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.
  • 21.
  • 22. 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
  • 23. 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) ; }) } });
  • 24. 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.
  • 25. 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} })
  • 26. 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
  • 27. 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();
  • 28. 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);
  • 29. 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); })
  • 30. Thank You! • Questions • Comments • More Info

Hinweis der Redaktion

  1. 20 min to here