building your first app with mongodb
DESCRIPTION
This talk will introduce the philosophy and features of the open source, NoSQL MongoDB. We’ll discuss the benefits of the document-based data model that MongoDB offers by walking through how one can build a simple app to store books. We’ll cover inserting, updating, and querying the database of books.TRANSCRIPT
Technical Services Engineer, MongoDB
Thomas Rückstieß
#MongoDBDays
Building your first app; an introduction to MongoDB
Notes to the Presenter
• Themes for this presentation:
• First presentation in the conference. Keep it fun
• User is likely brand new to MongoDB and comes from traditional relational background
• This is an introduction. Don't go deep.. Introduce concepts and refer to later presentations that build on these concepts.
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 with key/value pairs (possibly nested)
{ username : “thomas.r", num_logins : 39, last_login : ISODate("2013-10-08T16:46:21Z"), permissions : ["read", "write", "list", "admin"], company : { name : "MongoDB, Inc." location : "Sydney, Australia" }
}
Open Source
• MongoDB is an open source project
• On GitHub
• Licensed under the AGPL
• Started & sponsored by 10gen (now MongoDB, Inc.)
• 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
www.etiennemansard.com
Horizontally Scalable
Shard NShard 3Shard 2Shard 1
Horizontally Scalable
Full Featured
• Ad Hoc queries
• Real time aggregation
• Rich query capabilities
• Strongly consistent
• Geospatial features
• Support for most programming languages
• Flexible schema
Database Landscape
Depth of Functionality
Scal
abili
ty &
Per
form
ance
Memcached
MongoDB
RDBMS
Sca
labi
lity
& P
erfo
rman
ce
mongodb.org/downloads
$ tar –z xvf mongodb-osx-x86_64-2.4.x.tgz
$ cd mongodb-osx-i386-2.4.4/bin
$ mkdir –p /data/db
$ ./mongod
Running MongoDB
$ mongo MongoDB shell version: 2.4.4 connecting to: test > db.test.insert( { text: 'Welcome to MongoDB’ } ) > db.test.find().pretty() {
"_id" : ObjectId("51c34130fbd5d7261b4cdb55"), "text" : "Welcome to MongoDB"
}
Mongo Shell
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
First step in any application is
Determine your entities
Entities in our Blogging System
• Users
• Articles
• Comments
• Tags
• Categories ( ? )
In a relational database app We would start by doing schema design
Typical (relational) ERD
User·Name·Email address
Category·Name·URL
Comment·Comment·Date·Author
Article·Name·Slug·Publish date·Text
Tag·Name·URL
Relational schema design
• Large ERD Diagrams
• Complex “create table” statements
• ORMs to map tables to objects
• Tables just to join tables together
• Lots of revisions until we get it right
In a MongoDB based app We start building our app and let the schema evolve
MongoDB ERD
User·Name·Email address
Article·Name·Slug·Publish date·Text·Author
Comment[]·Comment·Date·Author
Tag[]·Value
Category[]·Value
Working With MongoDB
The Shell
> var user = {
username: ’thomas.r',
first_name: ’Thomas',
last_name: ’Rückstieß',
}
Start with an object (or array, hash, dict, etc)
> db test > use blog
switched to db blog // syntax is “db.<collection>.<command>”
> db.users.insert( user )
Insert the Record
No db/collection creation necessary
// get one document (don’t care which one)
> db.users.findOne()
{
"_id" : ObjectId("50804d0bd94ccab2da652599"),
"username" : ”thomas.r",
"first_name" : ”Thomas",
"last_name" : ”Rückstieß"
}
Retrieve the Record again
_id
• _id is the primary key in MongoDB
• Any unique immutable value could be used
• Automatically created as an ObjectId if not provided
• Automatically indexed
ObjectId
• ObjectId is a special 12 byte value
• Guaranteed to be unique across your cluster
• ObjectId("50804d0bd94ccab2da652599") ts mac pid inc
> db.articles.insert( {
title: ‘Hello World’,
body: ‘This is my first blog post’,
date: new Date(‘2013-06-20’),
username: ‘thomas.r’,
tags: [‘adventure’, ‘mongodb’],
comments: [ ]
} )
Creating a Blog Article
> db.articles.find().pretty() {
"_id" : ObjectId("51c3bafafbd5d7261b4cdb5a"), "title" : "Hello World", "body" : "This is my first blog post", "date" : ISODate("2013-06-20T00:00:00Z"), "username" : ”thomas.r", "tags" : [ "adventure", "mongodb" ], "comments" : [ ]
}
Finding the Article
> db.articles.find( { _id : ObjectId("51c3bafafbd5d7261b4cdb5a") } )
.pretty()
{ "_id" : ObjectId("51c3bafafbd5d7261b4cdb5a"), "title" : "Hello World", "body" : "This is my first blog post", "date" : ISODate("2013-06-20T00:00:00Z"), "username" : ”thomas.r", "tags" : [ "adventure", "mongodb" ], "comments" : [ ]
}
Finding the Article
> db.articles.find( { tags : 'adventure’ } ).pretty() {
"_id" : ObjectId("51c3bcddfbd5d7261b4cdb5b"), "title" : "Hello World", "body" : "This is my first blog post", "date" : ISODate("2013-06-20T00:00:00Z"), "username" : ”thomas.r", "tags" : [ "adventure", "mongodb" ], "comments" : [ ]
}
Querying An Array
// the syntax is: “ update ( what, how ) “ > db.articles.update(
{ _id: ObjectId("51c3bcddfbd5d7261b4cdb5b”) }, { "$push" : { "comments" : { "name" : "Steve Noname", "comment" : "Awesome Post" } }
)
Using Update to Add a Comment
> db.articles.find( { username: “thomas.r” } ).pretty() {
"_id" : ObjectId("51c3bcddfbd5d7261b4cdb5b"), "body" : "This is my first blog post", "comments" : [ { "name" : "Steve Noname", "comment" : "Awesome Post" } ], "date" : ISODate("2013-06-20T00:00:00Z"), "tags" : [ "adventure", "mongodb" ], "title" : "Hello World", "username" : ”thomas.r"
}
Article with Comment Embedded
// remove comment with $pull > var last_comment = {
"name" : "Steve Noname", "comment" : "Awesome Post”
} > db.articles.update(
{ _id: ObjectId("51c3bcddfbd5d7261b4cdb5b") }, { $pull : { comments: last_comment } }
) // remove article > db.articles.remove(
{ _id: ObjectId("51c3bcddfbd5d7261b4cdb5b") } )
Remove Comments / Articles
MongoDB Drivers
Real applications are not built in the shell
MongoDB has native bindings for over 12 languages
MongoDB Drivers
• Official Support for 12 languages
• Community drivers for tons more
• Drivers connect to mongo servers
• Drivers translate BSON into native types
• mongo shell is not a driver, but works like one in some ways
• Installed using typical means (npm, pecl, gem, pip)
Learn more about MongoDB
Manual: docs.mongodb.org
Online Training at MongoDB University
We've introduced a lot of concepts here
Schema Design @ 11:00
User·Name·Email address
Article·Name·Slug·Publish date·Text·Author
Comment[]·Comment·Date·Author
Tag[]·Value
Category[]·Value
Replication @ 11:50
Secondary Secondary
Primary
Client ApplicationDriver
Write
Read Read
Sharding @ 14:00 www.etiennemansard.com
Indexing @ 15:50
7 16
1 2 5 6 9 12 18 21