KEMBAR78
Building your first app with MongoDB | PDF
#mongodbdays @mongodb @nleite #developers 
Building your first app 
An introduction to MongoDB 
Norberto Leite 
SA, MongoDB
First Things First!
Let’s not talk about Fußball!
Quick Introduction 
• Norberto Leite 
– SA 
– Madrid, Spain 
– norberto@mongodb.com 
– @nleite
Welcome to MongoDB Days 
Munich! 
This is YOUR conference!
Thanks for being part of the Family!
Grab our staff for anything you need!
What is MongoDB?
MongoDB is a ___________ database 
• Document 
• Open source 
• High performance 
• Horizontally scalable 
• Full featured
Document Database 
• Not for .PDF & .DOC files 
• A document is essentially an associative array 
• Document = JSON object 
• Document = PHP Array 
• Document = Python Dict 
• Document = Ruby Hash 
• etc
Open Source 
• MongoDB is an open source project 
• On GitHub 
• Licensed under the AGPL 
• Started & sponsored by MongoDB Inc (formerly 
10gen) 
• Commercial licenses available 
• Contributions welcome
High Performance 
• Written in C++ 
• Extensive use of memory-mapped files 
i.e. read-through write-through memory caching. 
• Runs nearly everywhere 
• Data serialized as BSON (fast parsing) 
• Full support for primary & secondary indexes 
• Document model = less work
Shard 1 Shard 2 Shard 3 Shard N 
Horizontally Scalable
Database Landscape
Full Featured 
• Ad Hoc queries 
• Real time aggregation 
• Rich query capabilities 
• Strongly consistent 
• Geospatial features 
• Support for most programming languages 
• Flexible schema
Setting Expectations 
• What is MongoDB 
• How to develop with MongoDB 
• Scale with MongoDB 
• Analytics 
• MMS 
• Sharding 
• Setting the correct environment
Ready to become a Pro!
mongodb.org/downloads
Running MongoDB 
$ tar –z xvf mongodb-osx-x86_64-2.6.5.tgz 
$ cd mongodb-osx-i386-2.4.4/bin 
$ mkdir –p /data/db 
$ ./mongod
Mongo Shell 
MacBook-Air-:~ $ mongo 
MongoDB shell version: 2.6.5 
connecting to: test 
> db.test.insert({text: 'Welcome to MongoDB'}) 
> db.test.find().pretty() 
{ 
"_id" : ObjectId("51c34130fbd5d7261b4cdb55"), 
"text" : "Welcome to MongoDB" 
}
Document Database
Terminology 
RDBMS MongoDB 
Table, View ➜ Collection 
Row ➜ Document 
Index ➜ Index 
Join ➜ Embedded Document 
Foreign Key ➜ Reference 
Partition ➜ Shard
Let’s Build a Blog
Let’s Build a Blog
Let’s Build a Personal Data Hub!
First step in any application is 
Determine your entities
Entities in our Data Hub 
• Accounts 
• Messages 
– emails 
– tweets 
– comments 
– streams 
• Notifications
In a relational base app 
We would start by doing schema 
design
Typical (relational) ERD 
Messages 
Email 
Tweets 
Facebook 
messages 
Alerts 
Accounts
Das ist beängstigende Sache
In a MongoDB based app 
We start building our app 
and let the schema evolve
MongoDB ERD 
Accounts 
- account 
- user 
- password 
- refresh_rate 
- uri 
Alerts 
Messages 
- id 
- time 
- account_id 
- from 
- to 
- body 
- attachments 
- text 
- user 
- time 
- retweets 
- subscribers 
- channel 
- rate 
- period 
- metrics:[] 
…
Working With MongoDB
Demo time
Switch to Your DB 
>db 
test 
> use datahub 
switching to db datahub
Create our first Document 
>var account = { 
"name": "gmail", 
"credentials": { 
"user": "norberto@mongodb.com", 
"password": "YOU WISH!" 
}, 
"smtp": "smpt.gmail.com", 
"tls": true 
}
Switch to Your DB 
>db 
test 
> use datahub 
switching to db datahub 
> db.accounts.insert( account )
Insert the Record 
> db.accounts.insert(account) 
No collection creation necessary
Find One Record 
> db.accounts.findOne() 
{ 
"_id": ObjectId("54490561150027cc775b1019"), 
"name": "gmail", 
"credentials": { 
"user": "norberto@mongodb.com", 
"password": "YOU WISH!" 
}, 
"smtp": "smpt.gmail.com", 
"tls": true 
}
_id 
• _id is the primary key in MongoDB 
• Automatically indexed 
• Automatically created as an ObjectId if not provided 
• Any unique immutable value could be used
ObjectId 
• ObjectId is a special 12 byte value 
• Guaranteed to be unique across your cluster 
• ObjectId("50804d0bd94ccab2da652599") 
|----ts-----||---mac---||-pid-||----inc-----| 
4 3 2 3
Rich Data Types 
> db.accounts.findOne() 
{ 
"_id": ObjectId("54490561150027cc775b1019"), 
"name": "gmail", 
"credentials": { 
Strings 
"user": "norberto@mongodb.com", 
"password": "YOU WISH!" 
}, 
”last_access": ISODate("2014-10-30T13:09:36.724Z"), 
"smtp": "smpt.gmail.com", 
"tls": true 
} 
Date 
Boolean
BSON
Inserting Messages (emails, tweets …) 
> db.messages.insert({ 
"_id" : ObjectId("54527e08257844421e64623f"), 
"favorited" : false, 
"contributors" : null, 
"truncated" : false, 
"text" : "converting to #java 8", 
"in_reply_to_status_id" : null, 
”hashtags”: [ "#java", ] 
… 
}
Inserting Messages (emails, tweets …) 
> db.messages.insert({ 
"_id" : ObjectId("54523d2d25784427c6fabce1"), 
"From" : "norberto@mongodb.com", 
"To" : "mongodb-user@googlegroups.com", 
"Date" : ISODate("2012-08-15T22:32:34Z"), 
"body" : { 
"text/plain" : ”Hello Munich, nice to see yalll!" 
}, 
"Subject" : ”Live From MongoDB World" 
})
Finding a Message 
> db.message.find().pretty() 
{ 
"_id" : ObjectId("54523d2d25784427c6fabce1"), 
"From" : "norberto@mongodb.com", 
"To" : "mongodb-user@googlegroups.com", 
"Date" : ISODate("2012-08-15T22:32:34Z"), 
"body" : { 
"text/plain" : ”Hello Munich, nice to see yalll!" 
}, 
"Subject" : ”Live From MongoDB World" 
} 
{ 
"_id" : ObjectId("54527e08257844421e64623f"), 
"favorited" : false, 
"contributors" : null, 
"truncated" : false, 
"text" : "converting to #java 8", 
"in_reply_to_status_id" : null, 
”hashtags”: [ "#java", ] 
… 
}
Querying An Array 
> db.article.find({"hashtags":"#java"}).pretty() 
{ 
"_id" : ObjectId("54527e08257844421e64623f"), 
"favorited" : false, 
"contributors" : null, 
"truncated" : false, 
"text" : "converting to #java 8, #programing ", 
"in_reply_to_status_id" : null, 
”hashtags”: [ "#java", "#programing"] 
… 
} 
query in JSON
Using Update to Add a Comment 
> db.messages.update({ 
"_id" : ObjectId("54523d2d25784427c6fabce1") }, 
{$set: { opened: 
{date: ISODate("2012-08-15T22:32:34Z"), user: ’Norberto'} 
} 
}) 
> 
which is a subdocument set new field on the document
Post with Comment Attached 
> db.message.findOne({"_id" : ObjectId("54523d2d25784427c6fabce1")}) 
{ 
"_id" : ObjectId("54523d2d25784427c6fabce1"), 
"From" : "norberto@mongodb.com", 
"To" : "mongodb-user@googlegroups.com", 
"Date" : ISODate("2012-08-15T22:32:34Z"), 
"body" : { 
"text/plain" : ”Hello Munich, nice to see yalll!" 
}, 
"Subject" : ”Live From MongoDB World” 
"opened" : {"date": ISODate("2012-08-15T22:32:34Z"), "user": ’Norberto'} 
} 
Find document by primary key
MongoDB Drivers
Real applications are not 
built in the shell
MongoDB has native 
bindings for over 12 
languages
Morphia 
MEAN Stack 
Java 
Python 
Perl 
Ruby 
Support for the 
most popular 
languages and 
frameworks
Great, I’m excited! What’s next?
docs.mongodb.org
Never Stop Learning!
Schema Design, Schema 
Design, Schema Design, 
Schema Design!
Legacy Migration 
1. Copy existing schema & some data to MongoDB 
2. Iterate schema design development 
Measure performance, find bottlenecks, and embed 
1. one to one associations first 
2. one to many associations next 
3. many to many associations 
3. Migrate full dataset to new schema 
New Software Application? Embed by default
Embedding over Referencing 
• Embedding is a bit like pre-joined data 
– BSON (Binary JSON) document ops are easy for the server 
• Embed (90/10 following rule of thumb) 
– When the “one” or “many” objects are viewed in the context 
of their parent 
– For performance 
– For atomicity 
• Reference 
– When you need more scaling 
– For easy consistency with “many to many” associations 
without duplicated data
It’s All About Your Application 
• Programs+Databases = (Big) Data Applications 
• Your schema is the impedance matcher 
– Design choices: normalize/denormalize, reference/embed 
– Melds programming with MongoDB for best of both 
– Flexible for development and change 
• Programs×MongoDB = Great Big Data Applications
We've introduced a lot of 
concepts here
IoT
MMS @ 
Scale Easily 
Best Practices, 
Automated 
Cut 
Management 
Overhead
Scalability @
DevOps @ 
Provision 
Upgrade 
Scale 
Continuous Backup 
Point-in-Time Recovery 
Performance Alerts
Wrapping up … 
• MongoDB is a great Developers Tool 
• Designed for : 
• Scalability 
• Flexibility 
• Performance 
• Multipurpose 
• Great Ecosystem
Well Done !
Questions?
#mongodbdays 
Obrigado! 
Norberto Leite 
norberto@mongodb.com

Building your first app with MongoDB

  • 2.
    #mongodbdays @mongodb @nleite#developers Building your first app An introduction to MongoDB Norberto Leite SA, MongoDB
  • 3.
  • 4.
    Let’s not talkabout Fußball!
  • 5.
    Quick Introduction •Norberto Leite – SA – Madrid, Spain – norberto@mongodb.com – @nleite
  • 7.
    Welcome to MongoDBDays Munich! This is YOUR conference!
  • 8.
    Thanks for beingpart of the Family!
  • 9.
    Grab our stafffor anything you need!
  • 10.
  • 11.
    MongoDB is a___________ database • Document • Open source • High performance • Horizontally scalable • Full featured
  • 12.
    Document Database •Not for .PDF & .DOC files • A document is essentially an associative array • Document = JSON object • Document = PHP Array • Document = Python Dict • Document = Ruby Hash • etc
  • 13.
    Open Source •MongoDB is an open source project • On GitHub • Licensed under the AGPL • Started & sponsored by MongoDB Inc (formerly 10gen) • Commercial licenses available • Contributions welcome
  • 14.
    High Performance •Written in C++ • Extensive use of memory-mapped files i.e. read-through write-through memory caching. • Runs nearly everywhere • Data serialized as BSON (fast parsing) • Full support for primary & secondary indexes • Document model = less work
  • 15.
    Shard 1 Shard2 Shard 3 Shard N Horizontally Scalable
  • 16.
  • 17.
    Full Featured •Ad Hoc queries • Real time aggregation • Rich query capabilities • Strongly consistent • Geospatial features • Support for most programming languages • Flexible schema
  • 18.
    Setting Expectations •What is MongoDB • How to develop with MongoDB • Scale with MongoDB • Analytics • MMS • Sharding • Setting the correct environment
  • 19.
  • 20.
  • 21.
    Running MongoDB $tar –z xvf mongodb-osx-x86_64-2.6.5.tgz $ cd mongodb-osx-i386-2.4.4/bin $ mkdir –p /data/db $ ./mongod
  • 22.
    Mongo Shell MacBook-Air-:~$ mongo MongoDB shell version: 2.6.5 connecting to: test > db.test.insert({text: 'Welcome to MongoDB'}) > db.test.find().pretty() { "_id" : ObjectId("51c34130fbd5d7261b4cdb55"), "text" : "Welcome to MongoDB" }
  • 23.
  • 24.
    Terminology RDBMS MongoDB Table, View ➜ Collection Row ➜ Document Index ➜ Index Join ➜ Embedded Document Foreign Key ➜ Reference Partition ➜ Shard
  • 25.
  • 26.
  • 27.
    Let’s Build aPersonal Data Hub!
  • 28.
    First step inany application is Determine your entities
  • 29.
    Entities in ourData Hub • Accounts • Messages – emails – tweets – comments – streams • Notifications
  • 30.
    In a relationalbase app We would start by doing schema design
  • 31.
    Typical (relational) ERD Messages Email Tweets Facebook messages Alerts Accounts
  • 33.
  • 34.
    In a MongoDBbased app We start building our app and let the schema evolve
  • 35.
    MongoDB ERD Accounts - account - user - password - refresh_rate - uri Alerts Messages - id - time - account_id - from - to - body - attachments - text - user - time - retweets - subscribers - channel - rate - period - metrics:[] …
  • 36.
  • 37.
  • 38.
    Switch to YourDB >db test > use datahub switching to db datahub
  • 39.
    Create our firstDocument >var account = { "name": "gmail", "credentials": { "user": "norberto@mongodb.com", "password": "YOU WISH!" }, "smtp": "smpt.gmail.com", "tls": true }
  • 40.
    Switch to YourDB >db test > use datahub switching to db datahub > db.accounts.insert( account )
  • 41.
    Insert the Record > db.accounts.insert(account) No collection creation necessary
  • 42.
    Find One Record > db.accounts.findOne() { "_id": ObjectId("54490561150027cc775b1019"), "name": "gmail", "credentials": { "user": "norberto@mongodb.com", "password": "YOU WISH!" }, "smtp": "smpt.gmail.com", "tls": true }
  • 43.
    _id • _idis the primary key in MongoDB • Automatically indexed • Automatically created as an ObjectId if not provided • Any unique immutable value could be used
  • 44.
    ObjectId • ObjectIdis a special 12 byte value • Guaranteed to be unique across your cluster • ObjectId("50804d0bd94ccab2da652599") |----ts-----||---mac---||-pid-||----inc-----| 4 3 2 3
  • 45.
    Rich Data Types > db.accounts.findOne() { "_id": ObjectId("54490561150027cc775b1019"), "name": "gmail", "credentials": { Strings "user": "norberto@mongodb.com", "password": "YOU WISH!" }, ”last_access": ISODate("2014-10-30T13:09:36.724Z"), "smtp": "smpt.gmail.com", "tls": true } Date Boolean
  • 46.
  • 47.
    Inserting Messages (emails,tweets …) > db.messages.insert({ "_id" : ObjectId("54527e08257844421e64623f"), "favorited" : false, "contributors" : null, "truncated" : false, "text" : "converting to #java 8", "in_reply_to_status_id" : null, ”hashtags”: [ "#java", ] … }
  • 48.
    Inserting Messages (emails,tweets …) > db.messages.insert({ "_id" : ObjectId("54523d2d25784427c6fabce1"), "From" : "norberto@mongodb.com", "To" : "mongodb-user@googlegroups.com", "Date" : ISODate("2012-08-15T22:32:34Z"), "body" : { "text/plain" : ”Hello Munich, nice to see yalll!" }, "Subject" : ”Live From MongoDB World" })
  • 49.
    Finding a Message > db.message.find().pretty() { "_id" : ObjectId("54523d2d25784427c6fabce1"), "From" : "norberto@mongodb.com", "To" : "mongodb-user@googlegroups.com", "Date" : ISODate("2012-08-15T22:32:34Z"), "body" : { "text/plain" : ”Hello Munich, nice to see yalll!" }, "Subject" : ”Live From MongoDB World" } { "_id" : ObjectId("54527e08257844421e64623f"), "favorited" : false, "contributors" : null, "truncated" : false, "text" : "converting to #java 8", "in_reply_to_status_id" : null, ”hashtags”: [ "#java", ] … }
  • 50.
    Querying An Array > db.article.find({"hashtags":"#java"}).pretty() { "_id" : ObjectId("54527e08257844421e64623f"), "favorited" : false, "contributors" : null, "truncated" : false, "text" : "converting to #java 8, #programing ", "in_reply_to_status_id" : null, ”hashtags”: [ "#java", "#programing"] … } query in JSON
  • 51.
    Using Update toAdd a Comment > db.messages.update({ "_id" : ObjectId("54523d2d25784427c6fabce1") }, {$set: { opened: {date: ISODate("2012-08-15T22:32:34Z"), user: ’Norberto'} } }) > which is a subdocument set new field on the document
  • 52.
    Post with CommentAttached > db.message.findOne({"_id" : ObjectId("54523d2d25784427c6fabce1")}) { "_id" : ObjectId("54523d2d25784427c6fabce1"), "From" : "norberto@mongodb.com", "To" : "mongodb-user@googlegroups.com", "Date" : ISODate("2012-08-15T22:32:34Z"), "body" : { "text/plain" : ”Hello Munich, nice to see yalll!" }, "Subject" : ”Live From MongoDB World” "opened" : {"date": ISODate("2012-08-15T22:32:34Z"), "user": ’Norberto'} } Find document by primary key
  • 53.
  • 54.
    Real applications arenot built in the shell
  • 55.
    MongoDB has native bindings for over 12 languages
  • 56.
    Morphia MEAN Stack Java Python Perl Ruby Support for the most popular languages and frameworks
  • 58.
    Great, I’m excited!What’s next?
  • 59.
  • 60.
  • 61.
    Schema Design, Schema Design, Schema Design, Schema Design!
  • 62.
    Legacy Migration 1.Copy existing schema & some data to MongoDB 2. Iterate schema design development Measure performance, find bottlenecks, and embed 1. one to one associations first 2. one to many associations next 3. many to many associations 3. Migrate full dataset to new schema New Software Application? Embed by default
  • 63.
    Embedding over Referencing • Embedding is a bit like pre-joined data – BSON (Binary JSON) document ops are easy for the server • Embed (90/10 following rule of thumb) – When the “one” or “many” objects are viewed in the context of their parent – For performance – For atomicity • Reference – When you need more scaling – For easy consistency with “many to many” associations without duplicated data
  • 64.
    It’s All AboutYour Application • Programs+Databases = (Big) Data Applications • Your schema is the impedance matcher – Design choices: normalize/denormalize, reference/embed – Melds programming with MongoDB for best of both – Flexible for development and change • Programs×MongoDB = Great Big Data Applications
  • 65.
    We've introduced alot of concepts here
  • 66.
  • 67.
    MMS @ ScaleEasily Best Practices, Automated Cut Management Overhead
  • 68.
  • 69.
    DevOps @ Provision Upgrade Scale Continuous Backup Point-in-Time Recovery Performance Alerts
  • 70.
    Wrapping up … • MongoDB is a great Developers Tool • Designed for : • Scalability • Flexibility • Performance • Multipurpose • Great Ecosystem
  • 71.
  • 72.
  • 73.
    #mongodbdays Obrigado! NorbertoLeite norberto@mongodb.com