Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Why MongoDB Is Awesome

Why MongoDB Is Awesome

John Nunemaker

December 30, 2010
Tweet

More Decks by John Nunemaker

Other Decks in Programming

Transcript

  1. “ John Nunemaker ...the best features of key/ values stores,

    document databases and relational databases in one. RailsTips.org June '09
  2. I

  3. $ mkdir -p /data/db $ wget http://downloads.mongodb.org/osx/mongodb-osx-x86_64-1.4.2.tgz $ tar -xf

    mongodb-osx-x86_64-1.4.2.tgz $ mongodb-osx-x86_64-1.4.2/bin/mongod
  4. > show dbs admin harmony-development harmony-test local ... > use

    harmony-development switched to db harmony-development > show collections accounts activities assets items ...
  5. { "_id" : ObjectId("4be97eaebcd1b30e86000003"), "title" : "Ordered List", "creator_id" :

    ObjectId("4be97eadbcd1b30e86000001"), "memberships" : [ ObjectId("4be97eadbcd1b30e86000001"), ObjectId("4be97eaebcd1b30e86000002") ] }
  6. > use testing switched to db testing > db.colors.insert({name:'red', primary:true})

    > db.colors.insert({name:'green', primary:true}) > db.colors.insert({name:'blue', primary:true}) > db.colors.insert({name:'purple', primary:false}) > db.colors.insert({name:'orange', primary:false}) > db.colors.insert({name:'yellow', primary:false})
  7. > var cursor = db.colors.find() > cursor.next() { "_id" :

    ObjectId("4bed7aeb0b4acd070c593ba6"), "name" : "red", "primary" : true }
  8. > cursor { "_id" : ObjectId("4bed7af40b4acd070c593ba7"), "name" : "green", "primary"

    : true } { "_id" : ObjectId("4bed7af80b4acd070c593ba8"), "name" : "blue", "primary" : true } { "_id" : ObjectId("4bed7b570b4acd070c593ba9"), "name" : "purple", "primary" : false } { "_id" : ObjectId("4bed7b6a0b4acd070c593baa"), "name" : "orange", "primary" : false } { "_id" : ObjectId("4bed7b7d0b4acd070c593bab"), "name" : "yellow", "primary" : false }
  9. SELECT name from colors WHERE primary = 1 > db.colors.find({primary:true},

    {name:true}) { "_id" : ObjectId("4bed7aeb0b4acd070c593ba6"), "name" : "red" } { "_id" : ObjectId("4bed7af40b4acd070c593ba7"), "name" : "green" } { "_id" : ObjectId("4bed7af80b4acd070c593ba8"), "name" : "blue" }
  10. > db.colors.find({name:/l/}) { "_id" : ObjectId("4bed7af80b4acd070c593ba8"), "name" : "blue", "primary"

    : true } { "_id" : ObjectId("4bed7b570b4acd070c593ba9"), "name" : "purple", "primary" : false } { "_id" : ObjectId("4bed7b7d0b4acd070c593bab"), "name" : "yellow", "primary" : false }
  11. > db.colors.find({primary:true}).sort({name:1}).limit(1) { "_id" : ObjectId("4bed7af80b4acd070c593ba8"), "name" : "blue", "primary"

    : true } > db.colors.find({primary:true}).sort({name:-1}).limit(1) { "_id" : ObjectId("4bed7aeb0b4acd070c593ba6"), "name" : "red", "primary" : true }
  12. > db.colors.find({primary:true}).sort({name:1}).limit(1) { "_id" : ObjectId("4bed7af80b4acd070c593ba8"), "name" : "blue", "primary"

    : true } > db.colors.find({primary:true}).sort({name:-1}).limit(1) { "_id" : ObjectId("4bed7aeb0b4acd070c593ba6"), "name" : "red", "primary" : true } > db.colors.find({primary:true}).sort({name:1}).skip(1).limit(1) { "_id" : ObjectId("4bed7af40b4acd070c593ba7"), "name" : "green", "primary" : true }
  13. > db.people.find({age: {$gt: 27}}) { "_id" : ObjectId("4bed80b20b4acd070c593bac"), "name" :

    "John", "age" : 28 } { "_id" : ObjectId("4bed80bb0b4acd070c593bad"), "name" : "Steve", "age" : 29 } SELECT * from people WHERE age > 27
  14. SELECT * from people WHERE age <= 27 > db.people.find({age:

    {$lte: 27}}) { "_id" : ObjectId("4bed80c10b4acd070c593bae"), "name" : "Steph", "age" : 27 }
  15. $gt $gte $lt $lte $ne $in $nin $mod $all $size

    $exists $type $elemMatch $not $where
  16. // single ascending > db.colors.ensureIndex({name: 1}) // unique > db.colors.ensureIndex({email:

    1}, {unique: true}) // single descending > db.colors.ensureIndex({created_at: -1})
  17. // single ascending > db.colors.ensureIndex({name: 1}) // non-blocking in background

    > db.colors.ensureIndex({name: 1}, {background: true}) // unique > db.colors.ensureIndex({email: 1}, {unique: true}) // single descending > db.colors.ensureIndex({created_at: -1})
  18. // single ascending > db.colors.ensureIndex({name: 1}) // compound > db.colors.ensureIndex({name:

    1, created_at: -1}) // non-blocking in background > db.colors.ensureIndex({name: 1}, {background: true}) // unique > db.colors.ensureIndex({email: 1}, {unique: true}) // single descending > db.colors.ensureIndex({created_at: -1})
  19. > db.items.insert({title:'Home', template:'home'}) > db.items.insert({title:'What We Do', template:'page'}) > db.items.insert({title:'Our

    Writing', template:'page'}) > db.items.insert({title:'Who We Are', template:'page'}) > db.items.insert({title:'Hire Us', template:'page'}) > var key = {template: true}; > var initial = {count:0}; > var reduce = function(obj, prev) { prev.count += 1; }; > db.items.group({key:key, initial:initial, reduce:reduce}) [ {"template" : "home", "count" : 1}, {"template" : "page", "count" : 4} ]
  20. > db.items.insert({tags: ['dog', 'cat']}) > db.items.insert({tags: ['dog']}) > db.items.insert({tags: ['dog',

    'mouse']}) > db.items.insert({tags: ['dog', 'mouse', 'hippo']}) > db.items.insert({tags: ['dog', 'mouse', 'hippo']}) > db.items.insert({tags: ['dog', 'hippo']})
  21. > var reduce = function(key, values) { var count =

    0; for(var i=0, len=values.length; i<len; i++) { count += values[i].count; } return {count: count}; }
  22. > var result = db.items.mapReduce(map, reduce); > result { "ok"

    : 1, "timeMillis" : 86, "result" : "tmp.mr.mapreduce_1273861517_683", "counts" : { "input" : 6, "emit" : 13, "output" : 4 } }
  23. > db[result.result].find() { "_id" : "cat", "value" : { "count"

    : 1 } } { "_id" : "dog", "value" : { "count" : 6 } } { "_id" : "hippo", "value" : { "count" : 3 } } { "_id" : "mouse", "value" : { "count" : 3 } }
  24. > db.people.insert({ name : 'John', awesome : true, shows :

    ['Dexter', 'LOST', 'How I Met Your Mother'], info : { age : 28, home: 'South Bend, IN', dob : (new Date('November 25, 1981')) } })
  25. > var me = db.people.findOne({name:'John'}) > me.name John > me.awesome

    true > me.shows[1] LOST > me.info.age 28 > me.info.dob.getFullYear() 1981
  26. > db.people.find({'info.age': 28}) { "_id" : ObjectId("4bed9cba0b4acd070c593bc5"), "name" : "John"

    } > db.people.find({shows:'Dexter'}) { "_id" : ObjectId("4bed9cba0b4acd070c593bc5"), "name" : "John" }
  27. > db.people.find({'info.age': 28}) { "_id" : ObjectId("4bed9cba0b4acd070c593bc5"), "name" : "John"

    } > db.people.find({shows:'Dexter'}) { "_id" : ObjectId("4bed9cba0b4acd070c593bc5"), "name" : "John" } > db.people.find({shows:{$in:['Dexter', 'LOST']}}) { "_id" : ObjectId("4bed9cba0b4acd070c593bc5"), "name" : "John" }
  28. // insert post > db.posts.insert({title:'Why Mongo Rocks'}); > var post

    = db.posts.findOne({title:'Why Mongo Rocks'});
  29. // insert post > db.posts.insert({title:'Why Mongo Rocks'}); > var post

    = db.posts.findOne({title:'Why Mongo Rocks'}); // insert comment > db.comments.insert({ name :'John', body :'Because...', post_id : post._id }); > var comment = db.comments.findOne({name:'John'});
  30. > db.comments.find({post_id: post._id}) { "_id" : ObjectId("4bee1cc79e89db4e12bf78de"), "name" : "John",

    "body" : "Because...", "post_id" : ObjectId("4bee1c519e89db4e12bf78dd") } SELECT * FROM comments WHERE post_id = #{post.id}
  31. // insert post AND comments > db.posts.insert({ title:'Why Mongo Rocks',

    comments: [ {name:'John', body:'Because...'}, {name:'Steve', body:'Uh huh!'} ] })
  32. > var post = db.posts.find({title:'Why Mongo Rocks'}); > post {

    "_id" : ObjectId("4bee21259e89db4e12bf78df"), "title" : "Why Mongo Rocks", "comments" : [ {"name": "John", "body": "Because..."}, {"name": "Steve", "body": "Uh huh!"} ] }
  33. // insert post AND comments AND threads! > db.posts.insert({ title:'Why

    Mongo Rocks', comments: [ { name:'John', body:'Because...', comments: [ {name:'Frank', body:'You are crazy!'}, {name:'Billy', body:'Frank Furter!'} ] } ] })
  34. > db.posts.insert({ title : 'Why Mongo Rocks', tags : ['mongodb',

    'databases'] }) > db.posts.ensureIndex({tags:1})
  35. > db.sites.insert({domain: 'orderedlist.com'}) > db.sites.insert({domain: 'railstips.org'}) > db.sites.find() { "_id"

    : ObjectId("4bee280f9e89db4e12bf78e2"), "domain": "orderedlist.com" } { "_id" : ObjectId("4bee283c9e89db4e12bf78e3"), "domain": "railstips.org" }
  36. > db.users.insert({ name: 'John', authorizations: [ ObjectId('4bee280f9e89db4e12bf78e2'), ObjectId('4bee283c9e89db4e12bf78e3') ] })

    > db.users.insert({ name: 'Steve', authorizations: [ ObjectId('4bee280f9e89db4e12bf78e2') ] })
  37. > var orderedlist = db.sites.findOne({domain:'orderedlist.com'}) > db.users.find({authorizations:orderedlist._id}) // john and

    steve > var railstips = db.sites.findOne({domain:'railstips.org'}) > db.users.find({authorizations:railstips._id}) // john