Share
Embed
Building Your First App: An Introduction to MongoDB (MongoDB LA 2013)
Brandon Black
February 21, 2013
Transcript
59 slides
-
Software Engineer, 10gen @brandonmblack Brandon Black #MongoDBDays Building Your First
App: An Introduction to 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 -
Open Source • MongoDB is an open source project •
On GitHub • Licensed under the AGPL • Started & sponsored by 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 -
Full Featured • Ad Hoc queries • Real time aggregation
• Rich query capabilities • Traditionally consistent • Geospatial features • Support for most programming languages • Flexible schema -
RDBMS MongoDB Table, View Collection Row Document Index
Index Join Embedded Document Foreign Key Reference Partition Shard Terminology -
Typical (relational) ERD User ·Name ·Email address Category ·Name ·URL
Comment ·Comment ·Date ·Author Article ·Name ·Slug ·Publish date ·Text Tag ·Name ·URL -
MongoDB ERD User ·Name ·Email address Article ·Name ·Slug ·Publish
date ·Text ·Author Comment[] ·Comment ·Date ·Author Tag[] ·Value Category[] ·Value -
Library Management Application Entities • Library Patrons (users) • Books
(catalog) • Authors • Publishers • Categories ?? -
In a relational based app We would start by doing
schema design -
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 -
In a MongoDB based app We start building our app
and let the schema evolve -
user = { username: 'fred.jones', first_name: 'fred', last_name: 'jones', }
Start with an Object (or array, hash, dict, etc) -
> db.users.findOne() { "_id" : ObjectId("50804d0bd94ccab2da652599"), "username" : "fred.jones", "first_name"
: "fred", "last_name" : "jones" } Querying for the User -
_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 -
> 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 -
> 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 -
> 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/ -
> db.books.findOne({language: 'english'}, {genre: 1}) { "_id" : ObjectId("50804391d94ccab2da652598"), "genre"
: [ "fantasy", "adventure" ] } Multiple Values Per Key -
> 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. -
> db.books.findOne({}, {publication: 1}) { "_id" : ObjectId("50804ec7d94ccab2da65259a"), "publication" :
{ "name" : "george allen & unwin", "location" : "London", "date" : ISODate("1954-07-21T04:00:00Z") } } Nested Values -
> 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 -
> 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. -
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 -
> 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 -
> 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/ -
> 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/ -
> 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_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 -
> 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 -
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) -
Schema Design @ 10:35am User ·Name ·Email address Article ·Name
·Slug ·Publish date ·Text ·Author Comment[] ·Comment ·Date ·Author Tag[] ·Value Category[] ·Value -
7 16 1 2 5 6 9 12 18 21
B-Trees 13 {x: 13} Indexing @ 12:15pm -
Node 1 Secondary Config Server Node 1 Secondary Config Server
Node 1 Secondary Config Server Shard Shard Shard Mongos App Server Mongos App Server Mongos App Server Sharding @ 2:30pm -
• 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 • Resources https://education.10gen.com/ http://www.10gen.com/presentations http://github.com/brandonblack/presentations