Training
           http://www.mongodb.org/
Hi,	
  I’m	
  Mike.
• memcached
scalability	
  &	
  performance



                                      • key/value



                                                                            •   RDBMS




                                             depth	
  of	
  functionality
Key-­‐Value


MongoDB
              Relational
Goals for Today
“ODM”s



      Ruby	
  driver



The	
  “mongo”	
  JS	
  shell
Installing	
  MongoDB
documents
collections
dynamic	
  queries
secondary	
  indexes	
  	
  
explain
BSON
                     {“hello”:	
  “bson”}



x15	
  x00	
  x00	
  x00	
  x02	
  	
  	
  	
  h	
  	
  	
  	
  e
	
  	
  	
  l	
  	
  	
  	
  l	
  	
  	
  	
  o	
  x00	
  x05	
  x00	
  x00
x00	
  	
  	
  	
  b	
  	
  	
  	
  s	
  	
  	
  	
  o	
  	
  	
  	
  n	
  x00	
  x00


                                                              http://bsonspec.org
bsonspec.org
Messages


• TCP/IP Wire Protocol
• Separate messages for
  insert, update, query, get_more, delete, etc.




      http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol
Anatomy of an insert
    use	
  foo;
    db.test.insert({“hello”:	
  “bson”});



message length      request id                    response id op code (insert)
x67x00x00x00 xXXxXXxXXxXX x00x00x00x00 xd2x07x00x00

    reserved            collection name                                   document(s)
 x00x00x00x00     f	
  o	
  o	
  .	
  t	
  e	
  s	
  t	
  x00   BSON({“hello”:	
  “bson”})




             http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol
_id is the primary key
all about object ids
MongoDB standard
Timestamp
12-byte BSON type
If you still use a string, careful:
what’s in an oid?
what’s in an oid?
4b6857a0
timestamp
what’s in an oid?
4b6857a07613c3
timestamp
machine id
what’s in an oid?
4b6857a07613c36709
timestamp
machine id
process id
what’s in an oid?
4b6857a07613c367094426b2
timestamp
machine id
process id
counter
Simulating a flexible schema
Simulating a flexible schema




What’s the   join like?
Simulating a flexible schema




What’s the   join like?
Can we   reason    about it?
{:sku => ‘637636’,
 :name => ‘Linen tailored pant’,
 :about => [{:title => ‘fabric & care’,
              :content => [‘Dry clean’,
                              ‘Imported’]},
             {:title => ‘overview’,
              :content => [‘Tailored fit’,
                              ‘Yarn dyed’]}
            ]
} *
simplify tiny relations
simplify tiny relations
simplify tiny relations
simplify tiny relations
many-to-many
many-to-many
many-to-many
many-to-many
many-to-many
Commands
             db.foo.drop();

                 =
  db.foo.runCommand({drop:	
  "foo"});
                 =
   db.$cmd.findOne({drop:	
  "foo"});

                   =
db.$cmd.find({drop:	
  "foo"}).limit(-­‐1);
Query optimizer
     find({x:	
  10,	
  y:	
  “foo”})


         scan
                            terminate
   index on x

index on y           remember
Replication
                            master   slave

        master
                            master   slave


slave       slave   slave   master   master

                             slave   master
Replication


• oplog - capped collection
• idempotent ($inc -> $set)
Auto-sharding
                   Shards
          mongod   mongod    mongod
                                            ...
Config     mongod   mongod    mongod
Servers

mongod

mongod

mongod
                   mongos    mongos   ...


                    client
Geohashing
                  (20, 10)
     (0001	
  0100,	
  0000	
  1010)
        0000	
  0010	
  0110	
  0100
(21, 9) 0000	
  0010	
  0110	
  0011


     Problem: bit-flips (127 vs 128)

FrozenRails Training