Building Your First App with MongoDB

Preview:

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.

Citation preview

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

thomas@mongodb.com @tomonezero

Thomas Rückstieß

#MongoDBDays

Questions ?