This document provides an overview and introduction to MongoDB and Mongoose. It discusses how MongoDB is a document-oriented NoSQL database that stores data as JSON-like documents. It then introduces Mongoose as an object data modeling (ODM) library for MongoDB and Node.js applications that manages connections and schema. Various Mongoose concepts are explained such as schemas, models, CRUD operations, queries, validation, and plugins. The document aims to help developers get started with MongoDB and Mongoose.
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 the data
in a binary format
called BSON
Spec:
http://bsonspec.org/
Tuesday, February 12, 13
10. It’s A Document Oriented Data
Store
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 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
35. 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
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
38. 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
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
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
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