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