MongoDB RESTful API
Pete Jeffryes
@topleftdev
petej.org

Tools
Why Mongoose?
MongoDB Basics
CRUD
GOALS
Tools for the Job
Global
- Node
- MongoDB
- HTTPie
Local
- Express
- Mongoose
Why Mongoose?
- Object Modeling
- Type Casting
- Business Logic
Tools
Why Mongoose?
MongoDB Basics
CRUD
GOALS
MongoDB Fundamentals
- Schema
- Model
- Connection
Schema
- Definition takes value types
- references to simulate 'relationships'
- Instances are akin to SQL 'rows'
- Naming convention: itemSchema, carSchema, userSchema, etc.
item = {
name: 'chair',
quantity: 8,
_id: '42989d40fvldjfvr98',
_v: 0
}
item.quantity += '2'
console.log(item);
==> {
name: 'chair',
quantity: '82',
_id: '42989d40fvldjfvr98',
_v: 0
};
Un-enforced Schema - Bad
item = new Item {
name: 'chair',
quantity: 8,
_id: '42989d40fvldjfvr98',
_v: 0
}
item.quantity += '2'
==> TypeCast Error!
Enforced Schema - Good
var itemSchema = new Schema({
name: String,
quantity: Number
});
customerInfo = {
businessName: 'Denver Pizza Co.'
city: 'Denver',
state: 'Colorado',
_id: '42989d40fvldjfvr98',
_v: 0
}
cutomerInfo = {
businessName: [
'Bluebird Theater',
'Ogden Theater',
'Dazzle Jazz Club'
],
city: 'Denver',
state: 'Colorado',
_id: '42989d40fvldjfvr98',
_v: 0
}
Un-enforced Schema - POWERFUL!
var cutomerInfoSchema = new Schema({
businessName: Mixed,
city: String,
state: String
});
Model
- Akin to a SQL table
- 'collection' in MongoDB
- One Schema per Model
- gathers all 'docs'
- docs = instance of a schema
- model name:
- lower case
- plural
Connection
- Establishes database
- Opens connection
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var itemSchema = new Schema ({
name: String,
type: String
});
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var itemSchema = new Schema ({
name: String,
type: String
});
var Item = mongoose.model('items', itemSchema);
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var itemSchema = new Schema ({
name: String,
type: String
});
var Item = mongoose.model('items', itemSchema);
mongoose.connect('mongodb://localhost/mongo-crud');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var itemSchema = new Schema ({
name: String,
type: String
});
var Item = mongoose.model('items', itemSchema);
mongoose.connect('mongodb://localhost/mongo-crud');
module.exports = Item;
Tools
Why Mongoose?
MongoDB Basics
CRUD
GOALS
CRUD ROUTES
Read
Create
Update
Delete
CRUD ROUTES
Read
Create
Update
Delete
.find()
.save()
.findByIdAndUpdate()
.findByIdAndRemove()
Create
var express = require('express');
var router = express.router;
var Item = require('../database.js);
router.post('/items', function(req, res, next) {
var newItem = new Item({name: req.body.name, type: req.body.type});
newItem.save(function(err, data){
if (err) {
res.json(err);
}
else {
res.json(data);
}
});
});
Test
$ http -f POST localhost:3000/items name='bicycle' type='vehicle'

Read
var express = require('express');
var router = express.router;
var Item = require('../database.js);
router.get('/items', function(req, res, next) {
Item.find({}, function(err, data){
if (err) {
res.json(err);
}
else if (data.length===0) {
res.json({message: 'There are no items in the database.'});
}
else {
res.json(data);
}
});
});
Test

$ http GET localhost:3000/items
ObjectId = _id
time stamp
ObjectId(xxxxxxxxxx).getTimeStamp()
Handle asynchronous calls with
https://github.com/iolo/mongoose-q
mongooseQ
Read w/ Callback
var express = require('express');
var router = express.router;
var Item = require('../database.js);
router.get('/items', function(req, res, next) {
Item.find({}, function(err, data){
if (err) {
res.json(err);
}
else if (data.length===0) {
res.json({message: 'There are no items in the database.'});
}
else {
res.json(data);
}
});
});
var express = require('express');
var router = express.router;
var Item = require('../database.js);
var mongoose = require('mongoose-q')(require('mongoose'));
router.get('/items', function(req, res, next) {
Item.findQ({})
.then(function(response){ res.json(response);})
.catch(function(err){ res.json(err);})
.done();
});
Read w/ mongooseQ
Tools
Why Mongoose?
MongoDB Basics
CRUD
GOALS
mongooseQ
github.com/topleft/mongo-crud-tutorial
petej.ghost.io/2015/10/30/node-js-express-mongodb-restful-api/
petej.org
Node.js, Express, MongoDB Tutorial
Thanks!
petej.org
@topleft
MongoDB RESTful API
By Pete Jeffryes
MongoDB RESTful API
- 385