59
Software Engineer, 10gen @brandonmblack Brandon Black #MongoDBDays Building Your First App: An Introduction to MongoDB

Building Your First App: An Introduction to MongoDB

  • Upload
    mongodb

  • View
    989

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Building Your First App: An Introduction to MongoDB

Software Engineer, 10gen

@brandonmblack

Brandon Black

#MongoDBDays

Building Your First App:An Introduction to MongoDB

Page 2: Building Your First App: An Introduction to MongoDB

What is MongoDB?

Page 3: Building Your First App: An Introduction to MongoDB

MongoDB is a ___________ database• Document

• Open source

• High performance

• Horizontally scalable

• Full featured

Page 4: Building Your First App: An Introduction to MongoDB

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

Page 5: Building Your First App: An Introduction to MongoDB

Open Source

• MongoDB is an open source project

• On GitHub

• Licensed under the AGPL

• Started & sponsored by 10gen

• Commercial licenses available

• Contributions welcome

Page 6: Building Your First App: An Introduction to MongoDB

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

Page 7: Building Your First App: An Introduction to MongoDB

Horizontally Scalable

Page 8: Building Your First App: An Introduction to MongoDB

Full Featured

• Ad Hoc queries

• Real time aggregation

• Rich query capabilities

• Traditionally consistent

• Geospatial features

• Support for most programming languages

• Flexible schema

Page 9: Building Your First App: An Introduction to MongoDB

Database Landscape

Page 10: Building Your First App: An Introduction to MongoDB

http://www.mongodb.org/downloads

Page 11: Building Your First App: An Introduction to MongoDB

Mongo Shell

Page 12: Building Your First App: An Introduction to MongoDB

Document Database

Page 13: Building Your First App: An Introduction to MongoDB

RDBMS MongoDBTable, View ➜ CollectionRow ➜ DocumentIndex ➜ IndexJoin ➜ Embedded

DocumentForeign Key ➜ ReferencePartition ➜ Shard

Terminology

Page 14: Building Your First App: An Introduction to MongoDB

Typical (relational) ERD

Page 15: Building Your First App: An Introduction to MongoDB

MongoDB ERD

Page 16: Building Your First App: An Introduction to MongoDB

http://www.flickr.com/photos/somegeekintn/3484353131/

Library Management Application

Page 17: Building Your First App: An Introduction to MongoDB

First step in any application isDetermine your entities

Page 18: Building Your First App: An Introduction to MongoDB

Library Management Application Entities

• Library Patrons (users)

• Books (catalog)

• Authors

• Publishers

• Categories ??

Page 19: Building Your First App: An Introduction to MongoDB

In a relational based appWe would start by doing schema design

Page 20: Building Your First App: An Introduction to MongoDB

Relational Schema Design• Large ERD Diagrams

• Complex create table statements

• ORMs to map tables to objects

• Tables just to join tables together

• For this simple app we'd have 5 tables and 5 join tables

• Lots of revisions until we get it just right

Page 21: Building Your First App: An Introduction to MongoDB

In a MongoDB based appWe start building our appand let the schema evolve

Page 22: Building Your First App: An Introduction to MongoDB

MongoDB Collections

• Users

• Books

• Authors

• Publishers

Page 23: Building Your First App: An Introduction to MongoDB

No Common LanguageMongo Shell

Page 24: Building Your First App: An Introduction to MongoDB

Working with MongoDB

Page 25: Building Your First App: An Introduction to MongoDB

user = {

username: 'fred.jones',

first_name: 'fred',

last_name: 'jones',

}

Start with an Object (or array, hash, dict, etc)

Page 26: Building Your First App: An Introduction to MongoDB

> db.users.insert(user)

Insert the Record

No collection creation needed

Page 27: Building Your First App: An Introduction to MongoDB

> db.users.findOne()

{

"_id" : ObjectId("50804d0bd94ccab2da652599"),

"username" : "fred.jones",

"first_name" : "fred",

"last_name" : "jones"

}

Querying for the User

Page 28: Building Your First App: An Introduction to MongoDB

_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

Page 29: Building Your First App: An Introduction to MongoDB

ObjectId

• ObjectId is a special 12 byte value

• Guaranteed to be unique across your cluster

• ObjectId("50804d0bd94ccab2da652599") |-------------||---------||-----||----------| ts mac pid inc

Page 30: Building Your First App: An Introduction to MongoDB

> db.author.insert({

first_name: 'j.r.r.',

last_name: 'tolkien',

bio: 'J.R.R. Tolkien (1892.1973), beloved throughout the world as the creator of The Hobbit and The Lord of the Rings, was a professor of Anglo-Saxon at Oxford, a fellow of Pembroke College, and a fellow of Merton College until his retirement in 1959. His chief interest was the linguistic aspects of the early English written tradition, but even as he studied these classics he was creating a set of his own.'

})

Creating an Author

Page 31: Building Your First App: An Introduction to MongoDB

> db.author.findOne( { last_name : 'tolkien' } )

{

"_id" : ObjectId("507ffbb1d94ccab2da652597"),

"first_name" : "j.r.r.",

"last_name" : "tolkien",

"bio" : "J.R.R. Tolkien (1892.1973), beloved throughout the world as the creator of The Hobbit and The Lord of the Rings, was a professor of Anglo-Saxon at Oxford, a fellow of Pembroke College, and a fellow of Merton College until his retirement in 1959. His chief interest was the linguistic aspects of the early English written tradition, but even as he studied these classics he was creating a set of his own."

}

Querying for Our Author

Page 32: Building Your First App: An Introduction to MongoDB

> db.books.insert({

title: 'fellowship of the ring, the',

author: ObjectId("507ffbb1d94ccab2da652597"),

language: 'english',

genre: ['fantasy', 'adventure'],

publication: {

name: 'george allen & unwin',

location: 'London',

date: new Date('21 July 1954'),

}

})

Creating a Book

http://society6.com/PastaSoup/The-Fellowship-of-the-Ring-ZZc_Print/

Page 33: Building Your First App: An Introduction to MongoDB

> db.books.findOne({language: 'english'}, {genre: 1})

{

"_id" : ObjectId("50804391d94ccab2da652598"),

"genre" : [

"fantasy",

"adventure"

]

}

Multiple Values Per Key

Page 34: Building Your First App: An Introduction to MongoDB

> db.books.findOne({genre: 'fantasy'}, {title: 1})

{

"_id" : ObjectId("50804391d94ccab2da652598"),

"title" : "fellowship of the ring, the"

}

Multiple Values Per Key

Query key with single value or multiple values the same way.

Page 35: Building Your First App: An Introduction to MongoDB

> db.books.findOne({}, {publication: 1})

{

"_id" : ObjectId("50804ec7d94ccab2da65259a"),

"publication" : {

"name" : "george allen & unwin",

"location" : "London",

"date" : ISODate("1954-07-21T04:00:00Z")

}

}

Nested Values

Page 36: Building Your First App: An Introduction to MongoDB

> db.books.findOne({'publication.date' :

{ $lt : new Date('21 June 1960')}}

){

"_id" : ObjectId("50804391d94ccab2da652598"),"title" : "fellowship of the ring, the","author" : ObjectId("507ffbb1d94ccab2da652597"),"language" : "english","genre" : [ "fantasy", "adventure" ],"publication" : {

"name" : "george allen & unwin","location" : "London","date" : ISODate("1954-07-

21T04:00:00Z")}

}

Query Nested Values with Dot Notation

Page 37: Building Your First App: An Introduction to MongoDB

> db.books.update(

{"_id" : ObjectId("50804391d94ccab2da652598")},

{

$set : {

isbn: '0547928211',

pages: 432

}

})

Update Books

This is true agile development . I’m simply changing how I work with the data, and the database follows.

Page 38: Building Your First App: An Introduction to MongoDB

db.books.findOne(){

"_id" : ObjectId("50804ec7d94ccab2da65259a"),"author" : ObjectId("507ffbb1d94ccab2da652597"),"genre" : [ "fantasy", "adventure" ],"isbn" : "0395082544","language" : "english","pages" : 432,"publication" : {

"name" : "george allen & unwin","location" : "London","date" : ISODate("1954-07-

21T04:00:00Z")},"title" : "fellowship of the ring, the"

}

Updated Book Record

Page 39: Building Your First App: An Introduction to MongoDB

> db.books.ensureIndex({title: 1})

> db.books.ensureIndex({genre : 1})

> db.books.ensureIndex({'publication.date': -1})

Creating Indexes

Page 40: Building Your First App: An Introduction to MongoDB

> db.books.findOne({title : /^fell/}){

"_id" : ObjectId("50804ec7d94ccab2da65259a"),"author" : ObjectId("507ffbb1d94ccab2da652597"),"genre" : [ "fantasy", "adventure" ],"isbn" : "0395082544","language" : "english","pages" : 432,"publication" : {

"name" : "george allen & unwin","location" : "London","date" : ISODate("1954-07-

21T04:00:00Z")},"title" : "fellowship of the ring, the"

}

Query with Regular Expressions

Page 41: Building Your First App: An Introduction to MongoDB

> db.books.insert({ title: 'two towers, the',author:

ObjectId("507ffbb1d94ccab2da652597"),language: 'english',isbn : "034523510X",genre: ['fantasy', 'adventure'],pages: 447,publication: {

name: 'george allen & unwin',

location: 'London', date: new Date('11 Nov 1954'),

}})

Adding More Books

http://society6.com/PastaSoup/The-Two-Towers-XTr_Print/

Page 42: Building Your First App: An Introduction to MongoDB

> db.books.insert({ title: 'return of the king, the',author:

ObjectId("507ffbb1d94ccab2da652597"),language: 'english',isbn : "0345248295",genre: ['fantasy', 'adventure'],pages: 544,publication: {

name: 'george allen & unwin',

location: 'London', date: new Date('20 Oct 1955'),

}})

Adding More Books

http://society6.com/PastaSoup/The-Return-of-the-King-Jsc_Print/

Page 43: Building Your First App: An Introduction to MongoDB

> db.books.find( { author: ObjectId("507ffbb1d94ccab2da652597")}) .sort({ 'publication.date' : -1}) .limit(1)

{"_id" : ObjectId("5080d33ed94ccab2da65259d"),"title" : "return of the king, the","author" : ObjectId("507ffbb1d94ccab2da652597"),"language" : "english","isbn" : "0345248295","genre" : [ "fantasy", "adventure" ],"pages" : 544,"publication" : {

"name" : "george allen & unwin","location" : "London","date" : ISODate("1955-10-

20T04:00:00Z")}

}

Cursors

Page 44: Building Your First App: An Introduction to MongoDB

page_num = 3;results_per_page = 10;cursor = db.books.find() .sort({ "publication.date" : -1 }) .skip((page_num - 1) * results_per_page) .limit(results_per_page);

Simple Pager

Page 45: Building Your First App: An Introduction to MongoDB

> book = db.books.findOne({"title" : "return of the king, the"})

> db.author.findOne({_id: book.author}){

"_id" : ObjectId("507ffbb1d94ccab2da652597"),"first_name" : "j.r.r.","last_name" : "tolkien","bio" : "J.R.R. Tolkien (1892.1973), beloved throughout

the world as the creator of The Hobbit and The Lord of the Rings, was a professor of Anglo-Saxon at Oxford, a fellow of Pembroke College, and a fellow of Merton College until his retirement in 1959. His chief interest was the linguistic aspects of the early English written tradition, but even as he studied these classics he was creating a set of his own."}

Finding an Author by Book

Page 46: Building Your First App: An Introduction to MongoDB

MongoDB Drivers

Page 47: Building Your First App: An Introduction to MongoDB

Real applications are not built in the shell

Page 48: Building Your First App: An Introduction to MongoDB

MongoDB Drivers

• Drivers connect to mongo servers

• Drivers translate BSON into native types

• The MongoDB shell is not a driver, but works like one in some ways

• Installed using typical means (npm, pecl, gem, pip)

Page 49: Building Your First App: An Introduction to MongoDB

MongoDB has native bindings for over 12 languages

Page 50: Building Your First App: An Introduction to MongoDB
Page 51: Building Your First App: An Introduction to MongoDB
Page 52: Building Your First App: An Introduction to MongoDB

Next Steps

Page 53: Building Your First App: An Introduction to MongoDB

We've introduced a lot of concepts here

Page 54: Building Your First App: An Introduction to MongoDB

Schema Design @ 10:35am

Page 55: Building Your First App: An Introduction to MongoDB

Indexing @ 12:15pm

Page 56: Building Your First App: An Introduction to MongoDB

Replication @ 1:45pm

Page 57: Building Your First App: An Introduction to MongoDB

Sharding @ 2:30pm

Page 58: Building Your First App: An Introduction to MongoDB

• What’s next?– Schema Design @ 10:35am– Indexing @ 12:15pm– Replication @ 1:45pm– Sharding @ 2:30pm– Webinar: Technical Overview of MongoDB (March

7th)– MongoDB User Group

• Resourceshttps://education.10gen.com/http://www.10gen.com/presentationshttp://github.com/brandonblack/presentations

Page 59: Building Your First App: An Introduction to MongoDB

Software Engineer, 10gen

@brandonmblack

Brandon Black

#MongoDBDays

Thank You