92

Webinar: Building Your First App in Node.js

  • Upload
    mongodb

  • View
    1.812

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Webinar: Building Your First App in Node.js
Page 2: Webinar: Building Your First App in Node.js

MongoDB + Node.js

Building first app with MongoDB and Node.js

Page 3: Webinar: Building Your First App in Node.js

3

Agenda

MongoDB + Node.js

Driver

ODM's

MEAN Stack

Meteor

Page 4: Webinar: Building Your First App in Node.js

4

Ola, I'm Norberto!

Norberto Leite

Technical Evangelist

Madrid, Spain

@nleite

[email protected]

http://www.mongodb.com/norberto

Page 5: Webinar: Building Your First App in Node.js

MongoDB Node.js

Page 6: Webinar: Building Your First App in Node.js

INFACT

Page 7: Webinar: Building Your First App in Node.js

MongoDB JavaScript

Page 8: Webinar: Building Your First App in Node.js

8

Few reasons why

Flexible AgileWeb

Language

Page 9: Webinar: Building Your First App in Node.js

9

MongoDB + Javascript

• MongoDB Shell

– JS interperter

• MongoDB MapReduce

– Runs on top of V8

– Map and Reduce functions are JS functions

• Native support for Node.js

– One of the most used Drivers out there!

– https://www.npmjs.com/package/mongodb

Page 10: Webinar: Building Your First App in Node.js

Node.js

Page 11: Webinar: Building Your First App in Node.js

11

2 Foundations

Events Streams

Page 12: Webinar: Building Your First App in Node.js

12

2 Foundations

• Events / Event Loop

– Single Thread Applications

– No threads

– Events Emitter

– Event Queue

– Known Events

• Streams

– Read, Write, Both

– Unix Pipes

– We use it extensively!

Page 13: Webinar: Building Your First App in Node.js

Install

Page 14: Webinar: Building Your First App in Node.js

npm package

$ npm install mongodb

Page 15: Webinar: Building Your First App in Node.js

Compatibility

http://docs.mongodb.org/ecosystem/drivers/node-js/#compatibility

Page 16: Webinar: Building Your First App in Node.js

16

Compatibility w/ MongoDB

Page 17: Webinar: Building Your First App in Node.js

Initialize Project

Page 18: Webinar: Building Your First App in Node.js

package.json file

$ mkdir firstappnodejs

$ cd firstappnodejs

$ npm init

Page 19: Webinar: Building Your First App in Node.js

package.json file

$ mkdir firstappnodejs

$ cd firstappnodejs

$ npm init

...{

"name": "firstappnodejs",

"version": "0.0.1",

"description": "Small demo webinar application",

"main": "index.js",

"scripts": {

"test": "workitout"

},

"repository": {

"type": "git",

"url": "git://github.com/nleite/firstappnodejs"

},

"dependencies": {

"mongodb": "~2.0"

},

"keywords": [http://docs.mongodb.org/ecosystem/drivers/node-js/#compatibility

"demo",

"nodejs",

"mongodb"

],

"author": "Norberto Leite",

"license": "Apache 2.0",

"bugs": {

"url": "https://github.com/nleite/firstappnodejs/issues"

},

"homepage": "https://github.com/nleite/firstappnodejs"

}

Page 20: Webinar: Building Your First App in Node.js

package.json file

$ mkdir firstappnodejs

$ cd firstappnodejs

$ npm init

...{

"name": "firstappnodejs",

"version": "0.0.1",

"description": "Small demo webinar application",

"main": "index.js",

"scripts": {

"test": "workitout"

},

"repository": {

"type": "git",

"url": "git://github.com/nleite/firstappnodejs"

},

"dependencies": {

"mongodb": "~2.0"

},

"keywords": [

"demo",

"nodejs",

"mongodb"

],

"author": "Norberto Leite",

"license": "Apache 2.0",

"bugs": {

"url": "https://github.com/nleite/firstappnodejs/issues"

},

"homepage": "https://github.com/nleite/firstappnodejs"

}

Page 21: Webinar: Building Your First App in Node.js

Install our new firstappnodejs app!

$ npm install

> [email protected] install …

> [email protected] install

> [email protected] node_modules/mongodb

├── [email protected] ([email protected], [email protected],

[email protected], [email protected])

└── [email protected] ([email protected], [email protected])

firstappnodejs/ $ ls

node_modules package.json

Page 22: Webinar: Building Your First App in Node.js

Connect

Page 23: Webinar: Building Your First App in Node.js

boot up MongoDB Server

$ mkdir ~/firstappdb

$ mongod --dbpath ~/firstappdb

Page 24: Webinar: Building Your First App in Node.js

boot up MongoDB Server

$ mkdir ~/firstappdb

$ mongod --dbpath ~/firstappdb --auth

--keyfile ~/n.pem

https://www.mongodb.com/products/mongodb-enterprise-advanced

Page 25: Webinar: Building Your First App in Node.js

boot up MongoDB Server

$ mkdir ~/firstappdb

$ mongod --dbpath ~/firstappdb --auth

--keyfile ~/n.pem

https://www.mongodb.com/products/mongodb-enterprise-advanced

Page 26: Webinar: Building Your First App in Node.js

var MongoClient = require('mongodb').MongoClient,

assert = require('assert');

Connect

Page 27: Webinar: Building Your First App in Node.js

var MongoClient = require('mongodb').MongoClient,

assert = require('assert');

//connection uri

var uri = "mongodb://localhost:27017/firstapp"

Connect

Page 28: Webinar: Building Your First App in Node.js

var MongoClient = require('mongodb').MongoClient,

assert = require('assert');

//connection uri

var uri = "mongodb://localhost:27017/firstapp"

//connect to MongoDB

MongoClient.connect(uri, function(err, db){

assert.equal(null, err);

console.log("Connected correctly to server");

db.close();

});

Connect

Page 29: Webinar: Building Your First App in Node.js

29

Connection Pooling

• No traditional Pooling mechanism

– Single thread process

• Sockets to pipeline operations

• Failover

– Buffering up operations

– bufferMaxEntries

– numberOfRetries

– retryMiliSeconds

http://mongodb.github.io/node-mongodb-native/2.0/api/Db.html

Page 30: Webinar: Building Your First App in Node.js

CRUD

Page 31: Webinar: Building Your First App in Node.js

var insertDocuments = function(db, cb){

//we don't need to explicitly create a collection

var collection = db.collection('myCollection');

collection.insertMany([

{"mongodb": "is just awesome"},

{"nodejs": "so awesome"}

], function(err, result){

assert.equal(null, err);

//inserted 2 documents

assert.equal(2, result.insertedCount);

//invoke callback

cb(result);

});

}

Insert

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#insert

Page 32: Webinar: Building Your First App in Node.js

var insertDocuments = function(db, cb){

//we don't need to explicitly create a collection

var collection = db.collection('myCollection');

collection.insertMany([

{"mongodb": "is just awesome"},

{"nodejs": "so awesome"}

], function(err, result){

assert.equal(null, err);

//inserted 2 documents

assert.equal(2, result.insertedCount);

//invoke callback

cb(result);

});

}

Insert

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#insert

Page 33: Webinar: Building Your First App in Node.js

var insertDocuments = function(db, cb){

//we don't need to explicitly create a collection

var collection = db.collection('myCollection');

collection.insertMany([

{"mongodb": "is just awesome"},

{"nodejs": "so awesome"}

], function(err, result){

assert.equal(null, err);

//inserted 2 documents

assert.equal(2, result.insertedCount);

//invoke callback

cb(result);

});

}

Insert

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#insert

Page 34: Webinar: Building Your First App in Node.js

var insertDocuments = function(db, cb){

//we don't need to explicitly create a collection

var collection = db.collection('myCollection');

collection.insertMany([

{"mongodb": "is just awesome"},

{"nodejs": "so awesome"}

], function(err, result){

assert.equal(null, err);

//inserted 2 documents

assert.equal(2, result.insertedCount);

//invoke callback

cb(result);

});

}

Insert

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#insert

Page 35: Webinar: Building Your First App in Node.js

MongoClient.connect(uri, function(err, db) {

assert.equal(null, err);

console.log("Sweet! Talking to Server");

insertDocuments(db, function() {

db.close();

});

});

Insert

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#insert

Page 36: Webinar: Building Your First App in Node.js

MongoClient.connect(uri, function(err, db) {

assert.equal(null, err);

console.log("Sweet! Talking to Server");

insertDocuments(db, function() {

db.close();

});

});

Insert

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#insert

Page 37: Webinar: Building Your First App in Node.js

var updateDocument = function(db, cb){

var collection = db.collection("myCollection");

collection.updateOne( {"mongodb": "is just awesome"},

{$set: {"users": ["nleite"]}}, function( err, result){

assert.equal(null, err);

assert.equal(1, result.modifiedCount);

console.log("Cool, just updated");

cb(result);

});

}

Update

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#update

Page 38: Webinar: Building Your First App in Node.js

var updateDocument = function(db, cb){

var collection = db.collection("myCollection");

collection.updateOne( {"mongodb": "is just awesome"},

{$set: {"users": ["nleite"]}}, function( err, result){

assert.equal(null, err);

assert.equal(1, result.modifiedCount);

console.log("Cool, just updated");

cb(result);

});

}

Update

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#update

Page 39: Webinar: Building Your First App in Node.js

var updateDocument = function(db, cb){

var collection = db.collection("myCollection");

collection.updateOne( {"mongodb": "is just awesome"},

{$set: {"users": ["nleite"]}}, function( err, result){

assert.equal(null, err);

assert.equal(1, result.modifiedCount);

console.log("Cool, just updated");

cb(result);

});

}

Update

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#update

Page 40: Webinar: Building Your First App in Node.js

var updateDocument = function(db, cb){

var collection = db.collection("myCollection");

collection.updateOne( {"mongodb": "is just awesome"},

{$set: {"users": ["nleite"]}}, function( err, result){

assert.equal(null, err);

assert.equal(1, result.modifiedCount);

console.log("Cool, just updated");

cb(result);

});

}

Update

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#update

Page 41: Webinar: Building Your First App in Node.js

MongoClient.connect(uri, function(err, db) {

assert.equal(null, err);

console.log("Ok, I can now update!");

updateDocuments(db, function() {

db.close();

});

});

Update

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#update

Page 42: Webinar: Building Your First App in Node.js

Remove

var removeDocument = function(db, cb){

var collection = db.collection("myCollection");

collection.deleteOne( {"users": "nleite"},

function( err, result){

assert.equal(null, err);

assert.equal(1, result.deletedCount);

console.log("purged the @nleite contaminateddata!");

cb(result);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#remove

Page 43: Webinar: Building Your First App in Node.js

Remove

var removeDocument = function(db, cb){

var collection = db.collection("myCollection");

collection.deleteOne( {"users": "nleite"},

function( err, result){

assert.equal(null, err);

assert.equal(1, result.deletedCount);

console.log("purged the @nleite contaminateddata!");

cb(result);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#remove

Page 44: Webinar: Building Your First App in Node.js

Remove

var removeDocument = function(db, cb){

var collection = db.collection("myCollection");

collection.deleteOne( {"users": "nleite"},

function( err, result){

assert.equal(null, err);

assert.equal(1, result.deletedCount);

console.log("purged the @nleite contaminateddata!");

cb(result);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#remove

Page 45: Webinar: Building Your First App in Node.js

Remove

MongoClient.connect(uri, function(err, db) {

assert.equal(null, err);

console.log("Ok, I can now delete!");

removeDocuments(db, function() {

db.close();

});

});

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#remove

Page 46: Webinar: Building Your First App in Node.js

Find

var findAllDocuments = function(db, cb){

var collection = db.collection('myDocuments');

//or collection.find()

collection.find({}).toArray(function(err, docs){

assert.equal(err, null);

assert.equal(1, docs.length);

console.log("Gotcha! found "+ docs.length);

console.dir(docs);

cb(docs);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#find

Page 47: Webinar: Building Your First App in Node.js

Find

var findAllDocuments = function(db, cb){

var collection = db.collection('myDocuments');

//or collection.find()

collection.find({}).toArray(function(err, docs){

assert.equal(err, null);

assert.equal(1, docs.length);

console.log("Gotcha! found "+ docs.length);

console.dir(docs);

cb(docs);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#find

Page 48: Webinar: Building Your First App in Node.js

Find

var findAllDocuments = function(db, cb){

var collection = db.collection('myDocuments');

//or collection.find()

collection.find({}).toArray(function(err, docs){

assert.equal(err, null);

assert.equal(1, docs.length);

console.log("Gotcha! found "+ docs.length);

console.dir(docs);

cb(docs);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#find

Page 49: Webinar: Building Your First App in Node.js

Flexibility

Page 50: Webinar: Building Your First App in Node.js

Schema Flexibility

Page 51: Webinar: Building Your First App in Node.js

Different Schemas

var insertDifferentShapes = function(db, cb){

var doc1 = {"name": "Norberto", "talks": [

{"nodejs":10}, {"java":15}, "python":11]};

var doc2 = {"name": "Bryan", "webinars": 30};

var coll = db.collection("content")

coll.insertMany( [doc1, doc2], function(err, result){

assert.equal(err, null);

assert.equal(2, result.insertedCount);

console.log("Sweet, inserted "+ result.insertedCount);

cb(result);

});

}

http://docs.mongodb.org/manual/data-modeling/

Page 52: Webinar: Building Your First App in Node.js

Different Schemas

var insertDifferentShapes = function(db, cb){

var doc1 = {"name": "Norberto", "talks": [

{"nodejs":10}, {"java":15}, "python":11]};

var doc2 = {"name": "Bryan", "webinars": 30};

var coll = db.collection("content")

coll.insertMany( [doc1, doc2], function(err, result){

assert.equal(err, null);

assert.equal(2, result.insertedCount);

console.log("Sweet, inserted "+ result.insertedCount);

cb(result);

});

}

http://docs.mongodb.org/manual/data-modeling/

Page 53: Webinar: Building Your First App in Node.js

WriteConcerns

Page 54: Webinar: Building Your First App in Node.js

WriteConcern w:1

Page 55: Webinar: Building Your First App in Node.js

WriteConcern w:2

Page 56: Webinar: Building Your First App in Node.js

WriteConcern j:true

Page 57: Webinar: Building Your First App in Node.js

Different WriteConcerns

var insertSuperImportant = function(db, cb){

var customer = {"name": "Manny Delgado", "age": 14};

var coll = db.collection("customers");

var writeConcern = {"w": "majority"};

col.insertOne( customer, writeConcern, function(err, result){

assert.equal(err, null);

assert.equal(1, result.insertedCount);

console.log("Inserted super important record");

cb(result);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/WriteConcernError.html

Page 58: Webinar: Building Your First App in Node.js

Different WriteConcerns

var insertSuperImportant = function(db, cb){

var customer = {"name": "Manny Delgado", "age": 14};

var coll = db.collection("customers");

var writeConcern = {"w": "majority"};

col.insertOne( customer, writeConcern, function(err, result){

assert.equal(err, null);

assert.equal(1, result.insertedCount);

console.log("Inserted super important record");

cb(result);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/WriteConcernError.html

Page 59: Webinar: Building Your First App in Node.js

Read Preference

Page 60: Webinar: Building Your First App in Node.js

60

Read Preference

• Read from Primary (default)

ReadPreference.PRIMARY

• Read from Primary Preferably

ReadPreference.PRIMARY_PREFERRED

• Read from Secondary

ReadPreference.SECONDARY

• Read from Secondary Preferably

ReadPreference.SECONDARY_PREFERRED

• Read from Nearest Node

ReadPreference.NEAREST

http://mongodb.github.io/node-mongodb-native/2.0/api/ReadPreference.html

Page 61: Webinar: Building Your First App in Node.js

Read From Nearest

var readNearestWaterMelonColor = function(db, cb){

var rp = ReadPreference.NEAREST;

var coll = db.collection("products", {ReadPreference:rp});

var query = {"color": "water melon green"};

collection.find(query).toArray(function(err, docs){

assert.equal(err, null);

assert.equal(1, docs.length);

console.log("So many products: "+ docs.length);

console.dir(docs);

cb(docs);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/ReadPreference.html

Page 62: Webinar: Building Your First App in Node.js

Read From Nearest

var readNearestWaterMelonColor = function(db, cb){

var rp = ReadPreference.NEAREST;

var coll = db.collection("products", {ReadPreference:rp});

var query = {"color": "water melon green"};

collection.find(query).toArray(function(err, docs){

assert.equal(err, null);

assert.equal(1, docs.length);

console.log("So many products: "+ docs.length);

console.dir(docs);

cb(docs);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/ReadPreference.html

Page 63: Webinar: Building Your First App in Node.js

Read From Nearest

var readNearestWaterMelonColor = function(db, cb){

var rp = ReadPreference.NEAREST;

var coll = db.collection("products", {readPreference:rp});

var query = {"color": "water melon green"};

collection.find(query).toArray(function(err, docs){

assert.equal(err, null);

assert.equal(1, docs.length);

console.log("So many products: "+ docs.length);

console.dir(docs);

cb(docs);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/ReadPreference.html

Page 64: Webinar: Building Your First App in Node.js

Aggregation

Page 65: Webinar: Building Your First App in Node.js

Aggregation

var aggregateAvgAgeGender = function( db, cb){

//{age:XX, name:"user name", gender: "M/F"}

var pipeline = [

{$group: { "_id": "$gender", avg_age: {$avg: "$age"}}},

];

var coll = db.collection("users");

var cursor = coll.aggregate(pipeline);

cursor.forEach( function(x){

console.log("Gender " + x._id + " age average " + x.avg_age)

}, function(x) {

cb(cursor);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#aggregate

Page 66: Webinar: Building Your First App in Node.js

Aggregation

var aggregateAvgAgeGender = function( db, cb){

//{age:XX, name:"user name", gender: "M/F"}

var pipeline = [

{$group: { "_id": "$gender", avg_age: {$avg: "$age"}}},

];

var coll = db.collection("users");

var cursor = coll.aggregate(pipeline);

cursor.forEach( function(x){

console.log("Gender " + x._id + " age average " + x.avg_age)

}, function(x) {

cb(cursor);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#aggregate

Page 67: Webinar: Building Your First App in Node.js

Aggregation

var aggregateAvgAgeGender = function( db, cb){

//{age:XX, name:"user name", gender: "M/F"}

var pipeline = [

{$group: { "_id": "$gender", avg_age: {$avg: "$age"}}},

];

var coll = db.collection("users");

var cursor = coll.aggregate(pipeline);

cursor.forEach( function(x){

console.log("Gender " + x._id + " age average " + x.avg_age)

}, function(x) {

cb(cursor);

});

}

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#aggregate

Page 68: Webinar: Building Your First App in Node.js

Aggregation

var aggregateAvgAgeGender = function( db, cb){

//{age:XX, name:"user name", gender: "M/F"}

var pipeline = [

{$match:{"age": $gt: 18}},

{$group: { "_id": "$gender", avg_age: {$avg: "$age"}}},

{$project:{"ID": "$_id", "average": "$avg_age" }}

];

var cursor = coll.aggregate(pipeline);

var coll = db.collection("users");

cursor.forEach( function(x){

console.log("Gender " + x._id + " age average " + x.avg_age)

}, function(x) {

cb(cursor);

});}

http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#aggregate

Page 69: Webinar: Building Your First App in Node.js

ODM's

Page 70: Webinar: Building Your First App in Node.js

Mongoose

Page 71: Webinar: Building Your First App in Node.js

71

Mongoose

• Schema Validation

• Casting

• Business Logic Wrapper

• http://mongoosejs.com/

Page 72: Webinar: Building Your First App in Node.js

Simple Mongoose

var mongoose = require('mongoose'), assert =require('assert')

var Schema = mongoose.Schema;

//define a schema

var userSchema = new Schema({ name: String, age:Number})

//create static members

userSchema.statics.findByName = function( name, cb){

return this.find( {"name": name}, cb);

}

Page 73: Webinar: Building Your First App in Node.js

Simple Mongoose

//generate a model

var User = mongoose.model('User', userSchema);

//initiate the new user, validates the given arguments

var u1 = User({name:"Many Delgado", age:14});

//just save it

u1.save(function(err){

assert.equal(null, err);

});

Page 74: Webinar: Building Your First App in Node.js

74

Other Projects

Project Repository

MongoSkin https://github.com/kissjs/node-mongoskin

Mongolia https://github.com/masylum/mongolia

Mongojs https://github.com/mafintosh/mongojs

MongoSmash https://github.com/bengl/mongosmash

Page 75: Webinar: Building Your First App in Node.js

MEAN Stack

Page 76: Webinar: Building Your First App in Node.js

76

MEAN Stack

• MongoDB

• Express.js

• Angular JS

• Node.js

Page 77: Webinar: Building Your First App in Node.js

Express is a minimal and flexible Node.js web

application framework that provides a robust

set of features for web and mobile

applications.

Page 78: Webinar: Building Your First App in Node.js

AngularJS lets you extend HTML vocabulary

for your application. The resulting

environment is extraordinarily expressive,

readable, and quick to develop

Page 79: Webinar: Building Your First App in Node.js

Building your first app with MongoDB: Creating

a REST API using the MEAN Stack

https://www.mongodb.com/blog/post/building-

your-first-application-mongodb-creating-rest-

api-using-mean-stack-part-1

Page 80: Webinar: Building Your First App in Node.js

Meteor

Page 81: Webinar: Building Your First App in Node.js

Meteor is a complete open source platform

for building web and mobile apps in pure

JavaScript.

Page 82: Webinar: Building Your First App in Node.js

82

Meteor

• Responsiveness

• Reactiveness

• Multiplatform

• Unified Package System

• Hot Deploys

https://www.meteor.com/try

Page 83: Webinar: Building Your First App in Node.js

METEOR: Build IOS and Android Apps

that are a delight to use

http://www.mongodb.com/blog/post/meteor-

build-ios-and-android-apps-are-delight-use

Page 84: Webinar: Building Your First App in Node.js

Recap

Page 85: Webinar: Building Your First App in Node.js

85

What we talked about today…

• Node.js is a very productive language

– Our driver is highly adopted

– Updated

– Fully compatible

• CRUD Operations

– Insert, Update, Remove, Delete

• Write Concerns

– Flexible to write

• Read Preferences

– Flexible to read

• Aggregation Framework

– Analytics at your fingertips

Page 86: Webinar: Building Your First App in Node.js

86

Large Ecosystem

• Mongoose

• Mean Stack

• Meteor

• Many other projects

Page 87: Webinar: Building Your First App in Node.js

87

Where to next?

• Questions on the driver:

– https://groups.google.com/forum/#!forum/node-mongodb-native

• Issues:

– https://jira.mongodb.org/browse/NODE/?selectedTab=com.atlass

ian.jira.jira-projects-plugin:summary-panel

• Tutorial:

– http://mongodb.github.io/node-mongodb-native/2.0/

• Todays code:

– https://github.com/nleite/firstappnodejs

• Other:

– http://www.mongodb.com/norberto

Page 88: Webinar: Building Your First App in Node.js

http://www.mongodb.com/webinar/managing-

mission-critical-app-downtime

Page 89: Webinar: Building Your First App in Node.js

89

For More Information

Resource Location

Case Studies mongodb.com/customers

Presentations mongodb.com/presentations

Free Online Training education.mongodb.com

Webinars and Events mongodb.com/events

Documentation docs.mongodb.org

MongoDB Downloads mongodb.com/download

Additional Info [email protected]

Blog blog.mongodb.com

Page 90: Webinar: Building Your First App in Node.js

90

Register now: mongodbworld.com

Use Code NorbertoLeite for additional 25% Off*Come as a group of 3 or more – Save another 25%

Page 91: Webinar: Building Your First App in Node.js

http://cl.jroo.me/z3/v/D/C/e/a.baa-Too-many-bicycles-on-the-van.jpg

Questions?

@nleite

[email protected]

http://www.mongodb.com/norberto

Page 92: Webinar: Building Your First App in Node.js