MongoDB
 Alex Bilbie
Alex Bilbie

Developer at the University of Lincoln
Happy MongoDB user since 2010
Tweet me @alexbilbie
Relational Database
Management Systems
Relational Database
Management Systems
        (RDBMS)
RDBMS

Almost every application has one
Schemas
Joins, aggregation, normalisation
RDBMS


Difficult to scale
Can be inflexible
MongoDB

Developed by 10gen in 2007
Open sourced in 2009
Bridge the gap between key-value stores and RDBMS
MongoDB
Performance
    “Bitchin’ fast”
Rich dynamic queries
Lazy creation
Schema-less
Easy replication and failover
Auto sharding
13 official language drivers (dozens of community-created drivers)
Memcached



                      Key/value
Performance
                                    MongoDB
                        stores




                                              RDBMS




                          Functionality
Limitations
No transactions
No joins
32bit integers
Memory-whore
16MB document size
Authentication
Some terminology

Document == row
Collection == table
Database == database
Documents
{
    “_id” : ObjectID(“7qhlhsdf89sdf98899989a”),
    “name” : “Alex”,
    “age” : 22,
    “tags” : [“PHP”, “REST”, “APIs”, “MongoDB”]
}
Documents

Can store JSON types - strings, integers, floats, doubles,
arrays, objects, null, boolean
Special types - data, object id, binary, regex, and code
16mb hard limit
Every document can have different keys
Collections
Collections


Logical groups of documents
Indexes
Databases

Contain collections
Authentication
   Global read/write user
   Local read/write user
   Local read only user
Executables
mongo
mongod
mongos
mongodump
mongorestore
mongosniff
PHP driver
pecl install mongo
Source on Github - http://lncn.eu/cdu7
Regularly updated


CodeIgniter library - http://lncn.eu/fmy5
mongo
> show dbs
 admin
 blog

> use blog
 switched to blog

> show collections
 posts
> db.posts.count()
 1
> db.posts.findOne()
 {
   _id : ObjectId(‘8dfhosiahdf89sf9sd’),
   title : “Hello world!”,
   body : “Lorem ipsum...”,
   author : {
     name : “Alex”
   }
 }
> db.posts.find().limit(1)
> db.posts.find().limit(1).pretty()
> db.posts.insert({
   title : “Another post”,
   body : “Dolor sit amet...”
   author : {
     name : “Alex”
   },
   tags : [“PHP”, “MongoDB”]
 })
> db.posts.save({...})
SELECT * FROM posts WHERE title =
“Another Post”
db.posts.find({title : “Another Post”})
{ _id : ObjectId(‘8dfhosiahdf89sf9sd’),
title : “Another post”, body : “Dolor sit
amet...”, author : {name : “Alex”}, tags :
[“PHP”, “MongoDB”] }
SELECT body FROM posts WHERE title =
“Another Post”
db.posts.find({title : “Another Post”},
{body : 1})
{ _id : ObjectId(‘8dfhosiahdf89sf9sd’),
body : “Dolor sit amet...” }
db.posts.find({}, {author.name : 1})
db.posts.find({author.name : /Alex/},
{author.name : 1})
db.posts.find({author.name : /alex/i},
{author.name : 1})
db.posts.find().sort(title : 1)
db.posts.find().sort(title : -1)
db.posts.find().limit(1)
db.posts.find().limit(1).skip(1)
db.people.insert({name : “Alex”, age: 22, sex :
“Male”})
db.people.insert({name : “Nick”, age: 24, sex :
“Male”})
db.people.insert({name : “Steph”, age: 28, sex :
“Female”})
SELECT * FROM people WHERE age > 22
db.people.find({age : {$gt : 22}})
SELECT * FROM people WHERE age <= 25
db.people.find({age : {$lte : 25}})
$gt   Greater than
$gte Greater than or equal to
$lt   Less than
$lte Less than or equal to
$ne    Not equal to
$in   In array
$nin Not in array
$mod Mod operator
$all Matches all values in array
$size Size of array
$exists Key in array exists
$type Matches data type
$not Negates value of another operator
$or   Where == OR ==
$nor Where !== AND !==
// single ascending index
db.people.ensureIndex({name:1})
// single descending index
db.people.ensureIndex({name:-1})
// unique
db.people.ensureIndex({name:-1},
{unique: true})
// non blocking
db.people.ensureIndex({name:1},
{background:true})
// compound
db.people.ensureIndex({name:1, age:
1})
{
    _id: ObjectId(‘...’),
    name: “Hotel IBIS”
    location: {
      lon: 54.2285,
      lat: -0.5477
    }
}
db.places.ensureIndex({location: 2d})
// Remove all documents
db.people.remove()
// Remove with condition
db.people.remove({name: “Alex”})
// Update
db.people.update({name: “Alex”},
{$set : {name: “Alex Bilbie”})
$inc     Increment value
$set     Set field to value
$unset    Delete field
$push     Appends field to value (if field is an
array otherwise works like $set)
$pushAll Multiple $push
$addToSet $push only if not exists
$pop     Array pop
$pull    Removes all occurrences of value
$pull   Removes all occurrences of
value
$pullAll Pull all values
$rename Rename field
$bit    Bitwise update of field
db.people.count()
db.people.count({name: “Alex”})
db.people.distinct(‘name’)
db.people.distinct(‘name’, {age: { $lte:
25}})
No joins?


1. Embed
2. Separate collection + double query
Embed
{
    comments: [
      {
        text: “Awesome dude!”
      },
      {
        text: “Totally radical”
      }
    ]
}
Embed

+ Keeps everything together (pre-joining)
- Harder to query
16mb hard limit on document size
Double query


> db.post.find({id: 123})
> db.comments.find({post_id: 123})
Double query

+ Don’t need to worry about hard limit
+ Much easier querying
+/- Double query
Some untruths
“MongoDB is not single server durable”
“MongoDB will lose my data because it is not ACID
compliant”
“I need 12 terabytes of RAM to use MongoDB”
“MongoDB is just CouchDB but with more marketing weight
behind it”
How we use MongoDB
              AD
Blackboard


              BP             Nucleus

CMIS
             Estates
How we use MongoDB
                 .xml
                 .json
                 .csv
                 .rdfxml
  Nucleus        .tutle
                 .n3
                 .ntriples
                 .kml
Appropriate Use Caes
Logs
Data warehousing / archiving
Location based apps (Foursquare / o2 Priorities)
Ecommerce (with RDBMS for billing)
Gaming
Real time stats
Less well suited use cases


Tractional systems
Epic join based query based systems
CodeIgniter and MongoDB

CodeIgniter library - http://lncn.eu/fmy5
Follows the query builder (active record) database library
Version 2.0 almost finished
CodeIgniter and Mongo

$this->mongo_db
 ->select(array(‘name’, ‘age’))
 ->where_lte(‘age’, 25)
 ->where_in(‘interests’, array(‘PHP,
‘MongoDB’))
 ->get(‘people’);
CodeIgniter Library v2.0

Multiple database support
Epic code clean up
Remove CodeIgniter-only functions so can be used in other
frameworks or vanilla PHP
Supports new MongoDB 2.0+ features
Where can I find out more?
mongodb.com
groups.google.com/group/mongodb-user
irc://irc.freenode.net/#mongodb
blog.boxedice.com
cookbook.mongodb.com
10gen.com/events
Thanks

Introduction to MongoDB