SlideShare a Scribd company logo
MongoDB + Node.js
Building first app with MongoDB and Node.js
2
Agenda
MongoDB + Node.js
Driver
ODM's
MEAN Stack
Meteor
3
Ola, I'm Norberto!
Norberto Leite
Technical Evangelist
Madrid, Spain
@nleite
norberto@mongodb.com
http://www.mongodb.com/norberto
MongoDB Node.js
INFACT
MongoDB JavaScript
7
Few reasons why
Flexible Agile
Web
Language
8
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
Node.js
10
2 Foundations
Events Streams
11
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!
Install
npm package
$ npm install mongodb
Compatibility
http://docs.mongodb.org/ecosystem/drivers/node-js/#compatibility
15
Compatibility w/ MongoDB
Initialize Project
package.json file
$ mkdir firstappnodejs
$ cd firstappnodejs
$ npm init
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"
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"
Install our new firstappnodejs app!
$ npm install
> kerberos@0.0.10 install …
…
> bson@0.3.1 install
> mongodb@2.0.28 node_modules/mongodb
├── readable-stream@1.0.31 (isarray@0.0.1, inherits@2.0.1,
string_decoder@0.10.31, core-util-is@1.0.1)
└── mongodb-core@1.1.25 (kerberos@0.0.10, bson@0.3.1)
firstappnodejs/ $ ls
node_modules package.json
Connect
boot up MongoDB Server
$ mkdir ~/firstappdb
$ mongod --dbpath ~/firstappdb
boot up MongoDB Server
$ mkdir ~/firstappdb
$ mongod --dbpath ~/firstappdb --auth
--keyfile ~/n.pem
https://www.mongodb.com/products/mongodb-enterprise-advanced
boot up MongoDB Server
$ mkdir ~/firstappdb
$ mongod --dbpath ~/firstappdb --auth
--keyfile ~/n.pem
https://www.mongodb.com/products/mongodb-enterprise-advanced
var MongoClient = require('mongodb').MongoClient,
assert = require('assert');
Connect
var MongoClient = require('mongodb').MongoClient,
assert = require('assert');
//connection uri
var uri = "mongodb://localhost:27017/firstapp"
Connect
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
28
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
CRUD
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
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
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
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
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
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
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
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
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
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
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
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 contaminated
data!");
cb(result);
});
}
http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#remove
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 contaminated
data!");
cb(result);
});
}
http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#remove
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 contaminated
data!");
cb(result);
});
}
http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#remove
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
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
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
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
Flexibility
Schema Flexibility
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/
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/
WriteConcerns
WriteConcern w:1
WriteConcern w:2
WriteConcern j:true
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
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
Read Preference
59
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
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
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
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
Aggregation
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
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
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
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
ODM's
Mongoose
70
Mongoose
•  Schema Validation
•  Casting
•  Business Logic Wrapper
•  http://mongoosejs.com/
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);
}
…
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);
});
73
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
MEAN Stack
75
MEAN Stack
•  MongoDB
•  Express.js
•  Angular JS
•  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.
AngularJS lets you extend HTML vocabulary
for your application. The resulting
environment is extraordinarily expressive,
readable, and quick to develop
Building your first app with MongoDB: Creating
a RESTAPI using the MEAN Stack
https://www.mongodb.com/blog/post/building-
your-first-application-mongodb-creating-rest-
api-using-mean-stack-part-1
Meteor
Meteor is a complete open source platform for
building web and mobile apps in pure
JavaScript.
81
Meteor
•  Responsiveness
•  Reactiveness
•  Multiplatform
•  Unified Package System
•  Hot Deploys
https://www.meteor.com/try
METEOR: Build IOS andAndroidApps
that are a delight to use
http://www.mongodb.com/blog/post/meteor-
build-ios-and-android-apps-are-delight-use
Recap
84
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
85
Large Ecosystem
•  Mongoose
•  Mean Stack
•  Meteor
•  Many other projects
86
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.atlassian.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
87
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 info@mongodb.com
Blog blog.mongodb.com
88
Register now: mongodbworld.com!
!
Use Code NorbertoLeite for additional 25% Off!
*Come as a group of 3 or more – Save another 25%!
http://cl.jroo.me/z3/v/D/C/e/a.baa-Too-many-bicycles-on-the-van.jpg
Questions?
@nleite
norberto@mongodb.com
http://www.mongodb.com/norberto
MongoDB and Node.js

More Related Content

PPTX
What Is Express JS?
PPTX
Nodejs functions & modules
PDF
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
PDF
Nodejs presentation
PPTX
Node.js Express
PPTX
Introduction to Node.js
PPTX
JSON: The Basics
PDF
What Is Express JS?
Nodejs functions & modules
Node.js Tutorial for Beginners | Node.js Web Application Tutorial | Node.js T...
Nodejs presentation
Node.js Express
Introduction to Node.js
JSON: The Basics

What's hot (20)

PPTX
Introduction to Spring Boot
PPTX
Introduction to Node js
PPTX
Express js
PPT
Angular Introduction By Surekha Gadkari
PPTX
Node js introduction
PPTX
Basic Concept of Node.js & NPM
PDF
NestJS
PPTX
Introduction Node.js
PPT
Php Presentation
PPT
Node.js Express Framework
PPTX
Spring boot Introduction
PDF
An introduction to MongoDB
PPTX
Introduction to Spring Framework
PPTX
Introduction to React JS
PDF
Nestjs MasterClass Slides
PPTX
Express JS
PPTX
Spring Boot and REST API
PPTX
File system node js
PPTX
Reactjs
Introduction to Spring Boot
Introduction to Node js
Express js
Angular Introduction By Surekha Gadkari
Node js introduction
Basic Concept of Node.js & NPM
NestJS
Introduction Node.js
Php Presentation
Node.js Express Framework
Spring boot Introduction
An introduction to MongoDB
Introduction to Spring Framework
Introduction to React JS
Nestjs MasterClass Slides
Express JS
Spring Boot and REST API
File system node js
Reactjs
Ad

Viewers also liked (20)

PPTX
harry presentation
PDF
How To Get Hadoop App Intelligence with Driven
PDF
OPENEXPO Madrid 2015 - Advanced Applications with MongoDB
PPTX
Advanced applications with MongoDB
PPTX
Data Distribution Theory
PDF
Advanced MongoDB Aggregation Pipelines
PDF
Analyse Yourself
PPTX
Data Treatment MongoDB
PPTX
MongoDB + Spring
PDF
MongoDB and Python
PDF
Geospatial and MongoDB
PPTX
MongoDB on Financial Services Sector
PDF
Building Killer RESTful APIs with NodeJs
KEY
Dcjq node.js presentation
PDF
MongoDB Certification Study Group - May 2016
PPTX
From Monolithic to Microservices in 45 Minutes
KEY
Getting Started with MongoDB and Node.js
PDF
How Financial Services Organizations Use MongoDB
PDF
Introduction to Nodejs
PPT
The MEAN Stack: MongoDB, ExpressJS, AngularJS and Node.js
harry presentation
How To Get Hadoop App Intelligence with Driven
OPENEXPO Madrid 2015 - Advanced Applications with MongoDB
Advanced applications with MongoDB
Data Distribution Theory
Advanced MongoDB Aggregation Pipelines
Analyse Yourself
Data Treatment MongoDB
MongoDB + Spring
MongoDB and Python
Geospatial and MongoDB
MongoDB on Financial Services Sector
Building Killer RESTful APIs with NodeJs
Dcjq node.js presentation
MongoDB Certification Study Group - May 2016
From Monolithic to Microservices in 45 Minutes
Getting Started with MongoDB and Node.js
How Financial Services Organizations Use MongoDB
Introduction to Nodejs
The MEAN Stack: MongoDB, ExpressJS, AngularJS and Node.js
Ad

Similar to MongoDB and Node.js (20)

PPTX
Webinar: Building Your First App in Node.js
PPTX
Webinar: Building Your First App in Node.js
PPTX
Getting Started with MongoDB and NodeJS
PDF
full stack modul 5, mongodb,webpack,front-end,back-end
PPTX
Node js crash course session 5
PPTX
Getting Started with MongoDB using Node.js
PPTX
Introduction-to-MongoDB with mongoose and Node
KEY
Practical Use of MongoDB for Node.js
PDF
Node Js, AngularJs and Express Js Tutorial
PDF
Mongoskin - Guilin
PPT
9. Document Oriented Databases
PDF
Building your first app with MongoDB
PDF
Writing RESTful web services using Node.js
DOCX
Mongoose getting started-Mongo Db with Node js
PDF
MongoDB: a gentle, friendly overview
PDF
Introduction to MongoDB
PPTX
MongoDB presentation
PPTX
Mongodb ExpressJS HandlebarsJS NodeJS FullStack
PPTX
Dev Jumpstart: Build Your First App with MongoDB
Webinar: Building Your First App in Node.js
Webinar: Building Your First App in Node.js
Getting Started with MongoDB and NodeJS
full stack modul 5, mongodb,webpack,front-end,back-end
Node js crash course session 5
Getting Started with MongoDB using Node.js
Introduction-to-MongoDB with mongoose and Node
Practical Use of MongoDB for Node.js
Node Js, AngularJs and Express Js Tutorial
Mongoskin - Guilin
9. Document Oriented Databases
Building your first app with MongoDB
Writing RESTful web services using Node.js
Mongoose getting started-Mongo Db with Node js
MongoDB: a gentle, friendly overview
Introduction to MongoDB
MongoDB presentation
Mongodb ExpressJS HandlebarsJS NodeJS FullStack
Dev Jumpstart: Build Your First App with MongoDB

More from Norberto Leite (20)

PDF
Data Modelling for MongoDB - MongoDB.local Tel Aviv
PPTX
Avoid Query Pitfalls
PPTX
MongoDB and Spark
PDF
Mongo db 3.4 Overview
PDF
MongodB Internals
PDF
MongoDB WiredTiger Internals
PDF
MongoDB 3.2 Feature Preview
PDF
Mongodb Spring
PDF
MongoDB on Azure
PDF
MongoDB: Agile Combustion Engine
PDF
MongoDB Capacity Planning
PDF
Spark and MongoDB
PDF
Python and MongoDB
PDF
Strongly Typed Languages and Flexible Schemas
PDF
Effectively Deploying MongoDB on AEM
PPTX
MongoDB Ops Manager
PDF
Let the Tiger Roar - MongoDB 3.0
PPTX
MongoDB + Java - Everything you need to know
PPTX
MongoDB Capacity Planning
PDF
Aggregation Framework MongoDB Days Munich
Data Modelling for MongoDB - MongoDB.local Tel Aviv
Avoid Query Pitfalls
MongoDB and Spark
Mongo db 3.4 Overview
MongodB Internals
MongoDB WiredTiger Internals
MongoDB 3.2 Feature Preview
Mongodb Spring
MongoDB on Azure
MongoDB: Agile Combustion Engine
MongoDB Capacity Planning
Spark and MongoDB
Python and MongoDB
Strongly Typed Languages and Flexible Schemas
Effectively Deploying MongoDB on AEM
MongoDB Ops Manager
Let the Tiger Roar - MongoDB 3.0
MongoDB + Java - Everything you need to know
MongoDB Capacity Planning
Aggregation Framework MongoDB Days Munich

Recently uploaded (20)

PPTX
AIRLINE PRICE API | FLIGHT API COST |
PDF
Perfecting Gamer’s Experiences with Performance Testing for Gaming Applicatio...
PDF
How Creative Agencies Leverage Project Management Software.pdf
PPTX
Materi-Enum-and-Record-Data-Type (1).pptx
PDF
How to Confidently Manage Project Budgets
PPTX
Mastering-Cybersecurity-The-Crucial-Role-of-Antivirus-Support-Services.pptx
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
Convert Thunderbird to Outlook into bulk
PPTX
ai tools demonstartion for schools and inter college
PPTX
Online Work Permit System for Fast Permit Processing
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PPT
JAVA ppt tutorial basics to learn java programming
PDF
Comprehensive Salesforce Implementation Services.pdf
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PPTX
Introduction to Artificial Intelligence
PPTX
How a Careem Clone App Allows You to Compete with Large Mobility Brands
PPTX
CRUISE TICKETING SYSTEM | CRUISE RESERVATION SOFTWARE
PDF
QAware_Mario-Leander_Reimer_Architecting and Building a K8s-based AI Platform...
PDF
Build Multi-agent using Agent Development Kit
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
AIRLINE PRICE API | FLIGHT API COST |
Perfecting Gamer’s Experiences with Performance Testing for Gaming Applicatio...
How Creative Agencies Leverage Project Management Software.pdf
Materi-Enum-and-Record-Data-Type (1).pptx
How to Confidently Manage Project Budgets
Mastering-Cybersecurity-The-Crucial-Role-of-Antivirus-Support-Services.pptx
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
Convert Thunderbird to Outlook into bulk
ai tools demonstartion for schools and inter college
Online Work Permit System for Fast Permit Processing
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
JAVA ppt tutorial basics to learn java programming
Comprehensive Salesforce Implementation Services.pdf
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
Introduction to Artificial Intelligence
How a Careem Clone App Allows You to Compete with Large Mobility Brands
CRUISE TICKETING SYSTEM | CRUISE RESERVATION SOFTWARE
QAware_Mario-Leander_Reimer_Architecting and Building a K8s-based AI Platform...
Build Multi-agent using Agent Development Kit
ManageIQ - Sprint 268 Review - Slide Deck

MongoDB and Node.js

  • 1. MongoDB + Node.js Building first app with MongoDB and Node.js
  • 3. 3 Ola, I'm Norberto! Norberto Leite Technical Evangelist Madrid, Spain @nleite [email protected] http://www.mongodb.com/norberto
  • 7. 7 Few reasons why Flexible Agile Web Language
  • 8. 8 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
  • 11. 11 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!
  • 13. npm package $ npm install mongodb
  • 17. package.json file $ mkdir firstappnodejs $ cd firstappnodejs $ npm init
  • 18. 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"
  • 19. 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"
  • 20. 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
  • 22. boot up MongoDB Server $ mkdir ~/firstappdb $ mongod --dbpath ~/firstappdb
  • 23. boot up MongoDB Server $ mkdir ~/firstappdb $ mongod --dbpath ~/firstappdb --auth --keyfile ~/n.pem https://www.mongodb.com/products/mongodb-enterprise-advanced
  • 24. boot up MongoDB Server $ mkdir ~/firstappdb $ mongod --dbpath ~/firstappdb --auth --keyfile ~/n.pem https://www.mongodb.com/products/mongodb-enterprise-advanced
  • 25. var MongoClient = require('mongodb').MongoClient, assert = require('assert'); Connect
  • 26. var MongoClient = require('mongodb').MongoClient, assert = require('assert'); //connection uri var uri = "mongodb://localhost:27017/firstapp" Connect
  • 27. 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
  • 28. 28 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
  • 29. CRUD
  • 30. 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
  • 31. 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
  • 32. 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
  • 33. 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
  • 34. 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
  • 35. 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
  • 36. 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
  • 37. 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
  • 38. 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
  • 39. 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
  • 40. 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
  • 41. 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 contaminated data!"); cb(result); }); } http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#remove
  • 42. 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 contaminated data!"); cb(result); }); } http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#remove
  • 43. 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 contaminated data!"); cb(result); }); } http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#remove
  • 44. 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
  • 45. 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
  • 46. 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
  • 47. 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
  • 50. 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/
  • 51. 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/
  • 56. 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
  • 57. 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
  • 59. 59 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
  • 60. 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
  • 61. 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
  • 62. 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
  • 64. 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
  • 65. 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
  • 66. 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
  • 67. 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
  • 68. ODM's
  • 70. 70 Mongoose •  Schema Validation •  Casting •  Business Logic Wrapper •  http://mongoosejs.com/
  • 71. 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); } …
  • 72. 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); });
  • 73. 73 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
  • 75. 75 MEAN Stack •  MongoDB •  Express.js •  Angular JS •  Node.js
  • 76. Express is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications.
  • 77. AngularJS lets you extend HTML vocabulary for your application. The resulting environment is extraordinarily expressive, readable, and quick to develop
  • 78. Building your first app with MongoDB: Creating a RESTAPI using the MEAN Stack https://www.mongodb.com/blog/post/building- your-first-application-mongodb-creating-rest- api-using-mean-stack-part-1
  • 80. Meteor is a complete open source platform for building web and mobile apps in pure JavaScript.
  • 81. 81 Meteor •  Responsiveness •  Reactiveness •  Multiplatform •  Unified Package System •  Hot Deploys https://www.meteor.com/try
  • 82. METEOR: Build IOS andAndroidApps that are a delight to use http://www.mongodb.com/blog/post/meteor- build-ios-and-android-apps-are-delight-use
  • 83. Recap
  • 84. 84 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
  • 85. 85 Large Ecosystem •  Mongoose •  Mean Stack •  Meteor •  Many other projects
  • 86. 86 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.atlassian.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
  • 87. 87 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
  • 88. 88 Register now: mongodbworld.com! ! Use Code NorbertoLeite for additional 25% Off! *Come as a group of 3 or more – Save another 25%!