Slide 1

Slide 1 text

MongoDB 101

Slide 2

Slide 2 text

I am... • Nick Jackson • Awesome Developer Dude • University of Lincoln • @jacksonj04

Slide 3

Slide 3 text

MongoDB Is... • A NoSQL document database.

Slide 4

Slide 4 text

Eh?

Slide 5

Slide 5 text

NoSQL • Is not a specification (unlike SQL). • (Generally) doesn’t have schemas. • (Generally) works at web-scale. • (Generally) doesn’t do relational integrity.

Slide 6

Slide 6 text

Document Databases • Store documents. • Don’t store key-value pairs. • Make building APIs and stuff really easy.

Slide 7

Slide 7 text

Ye Olde SQL id name email 1 Nick [email protected] 2 Joss [email protected]

Slide 8

Slide 8 text

Ye Olde SQL id name email office building 1 Nick ... 3107 MHT 2 Joss ... 3015 MHT 3 Harry ... NULL MHT

Slide 9

Slide 9 text

:-(

Slide 10

Slide 10 text

Documents: Awesome! { name: ‘Nick’, email: ‘[email protected]’, location: { office: ‘3105’, building: ‘MHT’ } }

Slide 11

Slide 11 text

Documents: Awesome! { name: ‘Harry’, email: ‘[email protected]’ }

Slide 12

Slide 12 text

Documents: Awesome! { name: ‘Joss’, email: ‘[email protected]’, location: { office: ‘3105’, building: ‘MHT’ }, likes: { music: [‘Folk’, ‘Hip-Hop’], drink: [‘Coffee’, ‘Ale’] } }

Slide 13

Slide 13 text

Servers Are Easy

Slide 14

Slide 14 text

On Its Own Mongo App

Slide 15

Slide 15 text

Replicated Mongo 1 Mongo 2 Mongo 3 App

Slide 16

Slide 16 text

Sharded App Router 1 Router 2 Mongo S1 Mongo S2 Mongo S3

Slide 17

Slide 17 text

http://mongodb.org

Slide 18

Slide 18 text

Inserts <3 JSON > db.people.save({name:'Nick'}) > db.people.save({name:'Joss'}) > db.people.save({name:'Harry'})

Slide 19

Slide 19 text

Query Be Simple... > db.people.find() { "_id" : ObjectId("4fa...103"), "name" : "Nick" } { "_id" : ObjectId("4fa...104"), "name" : "Joss" } { "_id" : ObjectId("4fa...105"), "name" : "Harry" }

Slide 20

Slide 20 text

Query Be Simple... > db.people.find({name:'Nick'}) { "_id" : ObjectId("4fa...103"), "name" : "Nick" }

Slide 21

Slide 21 text

Query Be Quick... > db.people.ensureIndex({name:1})

Slide 22

Slide 22 text

Updates are easy > db.people.update({name:'Nick'},{name:'Nick',likes: ['coffee']}) > db.people.find({name:'Nick'}) { "_id" : ObjectId("4fa...103"), "name" : "Nick", "likes" : [ "coffee" ] }

Slide 23

Slide 23 text

Queries are powerful > db.people.update({name:'Joss'},{name:'Joss',likes: ['coffee','folk music']}) > db.people.find({likes:'coffee'}) { "_id" : ObjectId("4fa...103"), "name" : "Nick", "likes" : [ "coffee" ] } { "_id" : ObjectId("4fa...104"), "name" : "Joss", "likes" : [ "coffee", "folk music" ] }

Slide 24

Slide 24 text

Deletes are also easy > db.people.remove({name:'Nick'}) > db.people.find() { "_id" : ObjectId("4fa...104"), "name" : "Joss", "likes" : [ "coffee", "folk music" ] } { "_id" : ObjectId("4fa...105"), "name" : "Harry" }

Slide 25

Slide 25 text

Cool Things! • Geospatial indexes. db.places.find({loc:{$near:[-2, 53]}}) • JavaScript in the Mongo shell. • Map/Reduce operations. • Can be used as a filesystem.

Slide 26

Slide 26 text

Downsides It has a few

Slide 27

Slide 27 text

It’s not ACID • Set of atomic operators, but no things like transactions. • No enforced consistency. At all. • No locking, so updates can collide and be lost. • Disk writes are (usually) deferred, so data can be lost in failures.

Slide 28

Slide 28 text

It’s not ‘Enterprise’ • Your DBAs will find it new and scary. • You need to un-learn a lot of the SQL mindset. • It’s not seen as ‘proven’, but this is generally rubbish.

Slide 29

Slide 29 text

Some MongoDB Users • Craigslist • MTV • SourceForge • Disney • National Archives • HM Government • The Guardian • New York Times • bit.ly • GitHub • Foursquare • http://lncn.eu/fhx5