SlideShare a Scribd company logo
Will Button - @wfbutton
Practical MongoDB
From template to
production
Many resources exist for individual components.
Getting them to work together is a different story.
{
name: ‘Will Button’,
contact: [twitter: ‘@wfbutton’, email: ‘willb@mylist.com’, web: ‘www.two4seven.me’],
role: [‘dev’, ‘ops’, ‘it’],
company: ‘myList.com’
}
mean stack
facebook
passport.js
d3.js
The problem.
Participants competing in a challenge log meals, workouts and health data into a private Facebook group
Facebook newsfeed algorithm
No reporting
Don’t want to lose demographics
Can we use existing frameworks to make it
better without losing the parts that work well?
The solution.
Tools and
Technologies
Practical
Application
Practical MongoDB
Step 1: MEAN Stack
Template
git clone http://github.com/linnovate/mean.git
Connecting Facebook…
https://developers.facebook.com/apps
Configure passport
Facebook Permissions
Default: profile, friends list, email
Can’t read newsfeed by default
Reading newsfeed requires valid
accessToken
Facebook Permissions
https://developers.facebook.com/docs/faceboo
k-login/permissions/
What about this
accessToken thing?
> db.users.findOne({ provider: "facebook" })
{
"__v" : 0,
"_id" : ObjectId("52f6fc252ae38687577cc688"),
"currentchallenge" : ObjectId("5308d9756d7d30a94b681b2d"),
"email" : "will@paleotracking.com",
"facebook" : {
"username" : "will.button.56",
"updated_time" : "2014-01-06T22:33:03+0000",
"verified" : true,
"locale" : "en_US",
"timezone" : -7,
"email" : "wfbutton@gmail.com",
"gender" : "male",
"education" : [
{ "type" : "High School", "school" : { "name" : "Sidney High School", "id" : "110094965686846" } }
],
"favorite_athletes" : [
{ "name" : "CrossFit Endurance", "id" : "182015510972" },
{ "name" : "Lucas Parker", "id" : "346667935460586" }
],
"favorite_teams" : [
{ "name" : "Dallas Cowboys", "id" : "99559607813" }
],
"work" : [
{ "start_date" : "0000-00", "employer" : { "name" : "myList", "id" : "105017792957809" } },
{ "end_date" : "0000-00", "start_date" : "2004-07-01", "employer" : { "name" : "NightHawk Radiology Services", "id" :
"115173631830635" } }
],
"bio" : "CrossFit Level 1 (CF-L1) Trainer",
"location" : { "name" : "Jost Van Dyke, British Virgin Islands", "id" : "327610993996350" },
"hometown" : { "name" : "Sidney, Texas", "id" : "108011082555210" },
"link" : "https://www.facebook.com/will.button.56",
"last_name" : "Button",
"first_name" : "Will",
"name" : "Will Button",
"id" : "100001902024344"
},
"name" : "Will Button",
"provider" : "facebook",
"username" : "will.button.56"
All of this for FREE
$$$$
But no accessToken

Passport.js
Refreshes oauth
accessToken
on login
YIKES!
Functional, but
not scalable.
User.js Model
Updated user.js
model to store
accessToken
Using Facebook OpenGraph
Displaying Entries
Practical MongoDB
Practical MongoDB
Stored Documents
{
"user" :
ObjectId("52f6fc252ae38687577cc688"),
"message" : "I ate my stuff",
"challenge" :
ObjectId("5302e4e445bae1611e2e60d9"),
"_id" :
ObjectId("53125a106184fe00006e46d6"),
"likes" : {
"data" : [ ]
},
"comments" : {
"data" : [ ]
},
"updated_time" : ISODate("2014-03-
01T22:07:12.442Z"),
"created_time" : ISODate("2014-03-
01T22:07:12.442Z"),
"__v" : 0
Journal Data Model
var JournalSchema = new Schema({
created_time: {
type: Date,
default: Date.now
},
updated_time: {
type: Date,
default: Date.now
},
message: {
type: String
},
comments: {
data: [CommentSchema]
},
likes: {
data: [LikesSchema]
},
user: {
type: Schema.ObjectId,
ref: 'User'
},
challenge: {
type: Schema.ObjectId,
ref: 'Challenge'
}
});
var LikesSchema = new Schema({
id: {
type: String
},
name: {
type: String
}
});
Controller (part of it anyway)
All accessible via Routes
Recap: Where are we now?
Reporting
Aggregation Framework
Aggregation : Quick Review
Pipeline for multiple stages of document transformations for producing aggregated results
Name Description
$project Reshapes a document stream. $project can rename, add, or remove fields as well as create
computed values and sub-documents.
$match Filters the document stream, and only allows matching documents to pass into the next
pipeline stage. $match uses standard MongoDB queries.
$limit Restricts the number of documents in an aggregation pipeline.
$skip Skips over a specified number of documents from the pipeline and returns the rest.
$unwind Takes an array of documents and returns them as a stream of documents.
$group Groups documents together for the purpose of calculating aggregate values based on a
collection of documents.
$sort Takes all input documents and returns them in a stream of sorted documents.
$geoNear Returns an ordered stream of documents based on proximity to a geospatial point.
db.journals.aggregate(
{ $group:
{ _id: "$from.name", numposts: { $sum: 1 } }
},
{ $project:
{ who: "$from.name", numposts: 1 } },
{ $sort:
{_id: 1 }
}
)
{
"result" : [
{
"_id" : "Andrew",
"numposts" : 83
},
{
"_id" : "Ben",
"numposts" : 108
},
########### results truncated for brevity ##########
{
"_id" : "Tara",
"numposts" : 20
},
{
"_id" : "Will",
"numposts" : 26
}
],
"ok" : 1
}
Accessible via:
http://localhost:3000/journals/ppu
Page is
rendered By a
controller
With a
directive
Using D3
injected as a
service
The Controller
angular.module('mean.reports').controller('ReportsController', ['$scope', '$http', function($scope, $http){
$http({
method: 'GET',
url: '/journals/ppu'
}).then(function(data, status) {
$scope.d3Data = data.data;
});
}]);
d3Bars Directive
this
gets normalized to
d3Bars Directive
D3 library injected as
a service
The d3 service is accessible
because we add the service to our
footer
And inject it as a
dependency
The service itself simply
downloads d3.js
Directives are just reusable pieces of code
Restrict where the
directive can be used
A/E/C
Scope refers to the type of isolated scope:
=  two way data binding with the parent DOM object
@  one way data binding with the parent DOM object
&  expression binding with the parent DOM object
link is basically
a controller
variables either specified
on declaration or use
defaults
Practical MongoDB
Where do we go from here?
Where do we go from here?
Add new
aggregation queries
to journals controller
Build new reports/d3
visualizations in
directives.js
Add directives to any page:
<d3-bars data="d3Data”></d3-bars>
The mistakes people I
make.
Request the right
Facebook
permissions
Setup your
Facebook
Developers Account
Make your Facebook app
public (at least for a few
minutes)
Facebook Graph
Explorer
Hardcode dummy
data first.
Don’t assume
.success(), wait for it
.then()
Do
this
now:
• Clone the MEAN stack
• Stub out dummy data
• Build a d3 graph
• Stick around
www.two4seven.me/dcc
@wfbutton

More Related Content

PDF
The Testing Games: Mocking, yay!
PDF
JSON and Swift, Still A Better Love Story Than Twilight
ODP
Event handling using jQuery
POTX
1140 p2 p04_and_1350_p2p05_and_1440_p2p06
PPTX
Mongo db modifiers
PPT
Hi5 Opensocial Code Lab Presentation
PDF
Desenvolvimento web com Ruby on Rails (parte 5)
PDF
Coming to Terms with GraphQL
The Testing Games: Mocking, yay!
JSON and Swift, Still A Better Love Story Than Twilight
Event handling using jQuery
1140 p2 p04_and_1350_p2p05_and_1440_p2p06
Mongo db modifiers
Hi5 Opensocial Code Lab Presentation
Desenvolvimento web com Ruby on Rails (parte 5)
Coming to Terms with GraphQL

What's hot (20)

PDF
Conquering JSONB in PostgreSQL
PPTX
A Rich Web Experience with jQuery, Ajax and .NET
PDF
Politics News and U.S. Elections Coverage
KEY
Mongo db presentation
PDF
MongoDB World 2018: Using Change Streams to Keep Up with Your Data
DOCX
Web scripts for practice
PPTX
Back to Basics: My First MongoDB Application
PDF
Politics News and U.S. Elections Coverage
PDF
Health News & Articles | Healthy Living
PDF
Politics News and U.S. Elections Coverage
PDF
Technology and Science News - ABC News
PDF
Technology and Science News - ABC News
KEY
Spiffy Applications With JavaScript
PDF
U.S. News | National News
PDF
A single language for backend and frontend from AngularJS to cloud with Clau...
PDF
What Would You Do? With John Quinones
PDF
Technology and Science News - ABC News
PDF
Web Integration Patterns in the Era of HTML5
PDF
Getting Started with MongoDB: 4 Application Designs
PPTX
Dream House Project Presentation
Conquering JSONB in PostgreSQL
A Rich Web Experience with jQuery, Ajax and .NET
Politics News and U.S. Elections Coverage
Mongo db presentation
MongoDB World 2018: Using Change Streams to Keep Up with Your Data
Web scripts for practice
Back to Basics: My First MongoDB Application
Politics News and U.S. Elections Coverage
Health News & Articles | Healthy Living
Politics News and U.S. Elections Coverage
Technology and Science News - ABC News
Technology and Science News - ABC News
Spiffy Applications With JavaScript
U.S. News | National News
A single language for backend and frontend from AngularJS to cloud with Clau...
What Would You Do? With John Quinones
Technology and Science News - ABC News
Web Integration Patterns in the Era of HTML5
Getting Started with MongoDB: 4 Application Designs
Dream House Project Presentation
Ad

Similar to Practical MongoDB (20)

PPTX
Big Data for each one of us
PDF
Evolving your Data Access with MongoDB Stitch
PDF
Tools and Projects Dec 2018 Edition
PPTX
Python Code Camp for Professionals 3/4
PPTX
How to leverage what's new in MongoDB 3.6
PPTX
Crafting Evolvable Api Responses
PDF
SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"
PDF
MongoDB Evenings Houston: What's the Scoop on MongoDB and Hadoop? by Jake Ang...
PPTX
API Design - 3rd Edition
PPTX
Scott Guthrie at Dot Net Startup meetup
KEY
OSCON 2011 CouchApps
PDF
Building Apps with MongoDB
PPTX
Python Code Camp for Professionals 4/4
PDF
Mocks, Proxies, and Transpilation as Development Strategies for Web Development
PDF
Analytics with MongoDB Aggregation Framework and Hadoop Connector
PPTX
Powering Systems of Engagement
PDF
MongoDB Evenings Dallas: What's the Scoop on MongoDB & Hadoop
PDF
Micro app-framework - NodeLive Boston
PDF
Micro app-framework
Big Data for each one of us
Evolving your Data Access with MongoDB Stitch
Tools and Projects Dec 2018 Edition
Python Code Camp for Professionals 3/4
How to leverage what's new in MongoDB 3.6
Crafting Evolvable Api Responses
SFScon17 - Patrick Puecher: "Exploring data with Elasticsearch and Kibana"
MongoDB Evenings Houston: What's the Scoop on MongoDB and Hadoop? by Jake Ang...
API Design - 3rd Edition
Scott Guthrie at Dot Net Startup meetup
OSCON 2011 CouchApps
Building Apps with MongoDB
Python Code Camp for Professionals 4/4
Mocks, Proxies, and Transpilation as Development Strategies for Web Development
Analytics with MongoDB Aggregation Framework and Hadoop Connector
Powering Systems of Engagement
MongoDB Evenings Dallas: What's the Scoop on MongoDB & Hadoop
Micro app-framework - NodeLive Boston
Micro app-framework
Ad

More from Will Button (9)

PDF
Build an Infra Product with AWS Fargate
PDF
DevOps for Developers
PDF
Deploy Nodejs on Docker
PDF
Effective Telepresence and Remote Collaboration
PDF
Traxticsearch
PPTX
No More Mr. Nice Guy The MEAN Stack
PPTX
Mongo Sharding: Case Study
PPTX
Mongoose and MongoDB 101
PPTX
Mongo db mug_2012-02-07
Build an Infra Product with AWS Fargate
DevOps for Developers
Deploy Nodejs on Docker
Effective Telepresence and Remote Collaboration
Traxticsearch
No More Mr. Nice Guy The MEAN Stack
Mongo Sharding: Case Study
Mongoose and MongoDB 101
Mongo db mug_2012-02-07

Recently uploaded (20)

PPTX
Reimagine Home Health with the Power of Agentic AI​
PDF
Softaken Excel to vCard Converter Software.pdf
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Digital Strategies for Manufacturing Companies
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
top salesforce developer skills in 2025.pdf
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
System and Network Administraation Chapter 3
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PPTX
Computer Software and OS of computer science of grade 11.pptx
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
PDF
Nekopoi APK 2025 free lastest update
PPTX
assetexplorer- product-overview - presentation
PPTX
L1 - Introduction to python Backend.pptx
PPT
Introduction Database Management System for Course Database
Reimagine Home Health with the Power of Agentic AI​
Softaken Excel to vCard Converter Software.pdf
CHAPTER 2 - PM Management and IT Context
Digital Strategies for Manufacturing Companies
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
top salesforce developer skills in 2025.pdf
Wondershare Filmora 15 Crack With Activation Key [2025
System and Network Administraation Chapter 3
2025 Textile ERP Trends: SAP, Odoo & Oracle
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Design an Analysis of Algorithms I-SECS-1021-03
Upgrade and Innovation Strategies for SAP ERP Customers
How to Choose the Right IT Partner for Your Business in Malaysia
Computer Software and OS of computer science of grade 11.pptx
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
Nekopoi APK 2025 free lastest update
assetexplorer- product-overview - presentation
L1 - Introduction to python Backend.pptx
Introduction Database Management System for Course Database

Practical MongoDB

  • 1. Will Button - @wfbutton Practical MongoDB
  • 2. From template to production Many resources exist for individual components. Getting them to work together is a different story.
  • 3. { name: ‘Will Button’, contact: [twitter: ‘@wfbutton’, email: ‘willb@mylist.com’, web: ‘www.two4seven.me’], role: [‘dev’, ‘ops’, ‘it’], company: ‘myList.com’ }
  • 5. The problem. Participants competing in a challenge log meals, workouts and health data into a private Facebook group Facebook newsfeed algorithm No reporting Don’t want to lose demographics Can we use existing frameworks to make it better without losing the parts that work well?
  • 8. Step 1: MEAN Stack Template git clone http://github.com/linnovate/mean.git
  • 11. Facebook Permissions Default: profile, friends list, email Can’t read newsfeed by default Reading newsfeed requires valid accessToken
  • 13. What about this accessToken thing? > db.users.findOne({ provider: "facebook" }) { "__v" : 0, "_id" : ObjectId("52f6fc252ae38687577cc688"), "currentchallenge" : ObjectId("5308d9756d7d30a94b681b2d"), "email" : "will@paleotracking.com", "facebook" : { "username" : "will.button.56", "updated_time" : "2014-01-06T22:33:03+0000", "verified" : true, "locale" : "en_US", "timezone" : -7, "email" : "wfbutton@gmail.com", "gender" : "male", "education" : [ { "type" : "High School", "school" : { "name" : "Sidney High School", "id" : "110094965686846" } } ], "favorite_athletes" : [ { "name" : "CrossFit Endurance", "id" : "182015510972" }, { "name" : "Lucas Parker", "id" : "346667935460586" } ], "favorite_teams" : [ { "name" : "Dallas Cowboys", "id" : "99559607813" } ], "work" : [ { "start_date" : "0000-00", "employer" : { "name" : "myList", "id" : "105017792957809" } }, { "end_date" : "0000-00", "start_date" : "2004-07-01", "employer" : { "name" : "NightHawk Radiology Services", "id" : "115173631830635" } } ], "bio" : "CrossFit Level 1 (CF-L1) Trainer", "location" : { "name" : "Jost Van Dyke, British Virgin Islands", "id" : "327610993996350" }, "hometown" : { "name" : "Sidney, Texas", "id" : "108011082555210" }, "link" : "https://www.facebook.com/will.button.56", "last_name" : "Button", "first_name" : "Will", "name" : "Will Button", "id" : "100001902024344" }, "name" : "Will Button", "provider" : "facebook", "username" : "will.button.56" All of this for FREE $$$$ But no accessToken 
  • 15. User.js Model Updated user.js model to store accessToken
  • 20. Stored Documents { "user" : ObjectId("52f6fc252ae38687577cc688"), "message" : "I ate my stuff", "challenge" : ObjectId("5302e4e445bae1611e2e60d9"), "_id" : ObjectId("53125a106184fe00006e46d6"), "likes" : { "data" : [ ] }, "comments" : { "data" : [ ] }, "updated_time" : ISODate("2014-03- 01T22:07:12.442Z"), "created_time" : ISODate("2014-03- 01T22:07:12.442Z"), "__v" : 0
  • 21. Journal Data Model var JournalSchema = new Schema({ created_time: { type: Date, default: Date.now }, updated_time: { type: Date, default: Date.now }, message: { type: String }, comments: { data: [CommentSchema] }, likes: { data: [LikesSchema] }, user: { type: Schema.ObjectId, ref: 'User' }, challenge: { type: Schema.ObjectId, ref: 'Challenge' } }); var LikesSchema = new Schema({ id: { type: String }, name: { type: String } });
  • 22. Controller (part of it anyway)
  • 24. Recap: Where are we now?
  • 27. Aggregation : Quick Review Pipeline for multiple stages of document transformations for producing aggregated results Name Description $project Reshapes a document stream. $project can rename, add, or remove fields as well as create computed values and sub-documents. $match Filters the document stream, and only allows matching documents to pass into the next pipeline stage. $match uses standard MongoDB queries. $limit Restricts the number of documents in an aggregation pipeline. $skip Skips over a specified number of documents from the pipeline and returns the rest. $unwind Takes an array of documents and returns them as a stream of documents. $group Groups documents together for the purpose of calculating aggregate values based on a collection of documents. $sort Takes all input documents and returns them in a stream of sorted documents. $geoNear Returns an ordered stream of documents based on proximity to a geospatial point.
  • 28. db.journals.aggregate( { $group: { _id: "$from.name", numposts: { $sum: 1 } } }, { $project: { who: "$from.name", numposts: 1 } }, { $sort: {_id: 1 } } ) { "result" : [ { "_id" : "Andrew", "numposts" : 83 }, { "_id" : "Ben", "numposts" : 108 }, ########### results truncated for brevity ########## { "_id" : "Tara", "numposts" : 20 }, { "_id" : "Will", "numposts" : 26 } ], "ok" : 1 }
  • 30. Page is rendered By a controller With a directive Using D3 injected as a service
  • 31. The Controller angular.module('mean.reports').controller('ReportsController', ['$scope', '$http', function($scope, $http){ $http({ method: 'GET', url: '/journals/ppu' }).then(function(data, status) { $scope.d3Data = data.data; }); }]);
  • 33. d3Bars Directive D3 library injected as a service
  • 34. The d3 service is accessible because we add the service to our footer And inject it as a dependency
  • 35. The service itself simply downloads d3.js
  • 36. Directives are just reusable pieces of code Restrict where the directive can be used A/E/C Scope refers to the type of isolated scope: =  two way data binding with the parent DOM object @  one way data binding with the parent DOM object &  expression binding with the parent DOM object
  • 37. link is basically a controller variables either specified on declaration or use defaults
  • 39. Where do we go from here?
  • 40. Where do we go from here? Add new aggregation queries to journals controller Build new reports/d3 visualizations in directives.js Add directives to any page: <d3-bars data="d3Data”></d3-bars>
  • 41. The mistakes people I make. Request the right Facebook permissions Setup your Facebook Developers Account Make your Facebook app public (at least for a few minutes) Facebook Graph Explorer Hardcode dummy data first. Don’t assume .success(), wait for it .then()
  • 42. Do this now: • Clone the MEAN stack • Stub out dummy data • Build a d3 graph • Stick around