KEMBAR78
MongoDB - Introduction | KEY
Introducing
   Vagmi Mudumbai
(vagmi@artha42.com)
Who am I?
Who am I?
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”]};
db.people.save(person);
A bit about NoSQL
Indexing       Ad-ho
                                            c   Quer
       tor age                                         ies
 SO NS
B
              M ap/Reduce            -place U pdates
                                  In
    Auto
           Shard                    Repli
                 ing                      catio
                                                n
                         GridFS



           What is it about
It makes us a super hero
BSON Storage
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”]};
db.people.save(person);


               http://bsonspec.org/
Binary
Supports datatypes like
• Date
• Bindata
• Regexs
Querying
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”],














age:
30,














location:
{city:
“chennai”}};
db.people.save(person);
Querying
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”],














age:
30,














location:
{city:
“chennai”}};
db.people.save(person);

db.people.find({type:
“hacker”});
Querying
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”],














age:
30,














location:
{city:
“chennai”}};
db.people.save(person);

db.people.find({type:
“hacker”});

db.people.find({uses:
“rails”});
//
can
search
within
tags
Querying
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”],














age:
30,














location:
{city:
“chennai”}};
db.people.save(person);

db.people.find({type:
“hacker”});

db.people.find({uses:
“rails”});
//
can
search
within
tags

db.people.find({age:
{$gt:
25}});
//
can
do
mathematics
Querying
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”],














age:
30,














location:
{city:
“chennai”}};
db.people.save(person);

db.people.find({type:
“hacker”});

db.people.find({uses:
“rails”});
//
can
search
within
tags

db.people.find({age:
{$gt:
25}});
//
can
do
mathematics

db.people.find({“location.city”:”chennai”});
//can
search














































//
within
docs
Querying
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”],














age:
30,














location:
{city:
“chennai”}};
db.people.save(person);

db.people.find({type:
“hacker”});

db.people.find({uses:
“rails”});
//
can
search
within
tags

db.people.find({age:
{$gt:
25}});
//
can
do
mathematics

db.people.find({“location.city”:”chennai”});
//can
search














































//
within
docs

db.people.find().sort({age:1}).skip(10).limit(10)
//pagination
Indexing
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”]};
db.people.save(person);
db.people.ensureIndex({“type”:1});
db.people.ensureIndex({“uses”:1});
db.people.getIndexes();
//
returns
a
list
of
indexes



No different from a standard database
Can index on multiple fields
Can index into sub documents and arrays
_id is automatically indexed
Updates
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”],














age:
30,














location:
{city:
“chennai”}};
db.people.save(person);
Updates
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”],














age:
30,














location:
{city:
“chennai”}};
db.people.save(person);

var
p
=
db.people.findOne({type:
“hacker”});
p.age
=
29;

db.people.save(p);
//updates
the
above
record
Updates
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”],














age:
30,














location:
{city:
“chennai”}};
db.people.save(person);

var
p
=
db.people.findOne({type:
“hacker”});
p.age
=
29;

db.people.save(p);
//updates
the
above
record

var
p
=
db.people.findOne({type:
“hacker”});
db.people.update({_id:
p._id},{$inc:{age:1}});
Updates
var
person
=
{name:
“Vagmi
Mudumbai”,
type:
”hacker”














hacks_on:
[“artha42”,”chennaigeeks”],














uses:
[“mongodb”,”rails”,”sinatra”],














age:
30,














location:
{city:
“chennai”}};
db.people.save(person);

var
p
=
db.people.findOne({type:
“hacker”});
p.age
=
29;

db.people.save(p);
//updates
the
above
record

var
p
=
db.people.findOne({type:
“hacker”});
db.people.update({_id:
p._id},{$inc:{age:1}});

var
p
=
db.people.findOne({type:
“hacker”});
db.people.update({_id:
p._id},

















{$inc:{age:1},$push:{uses:
“vim”}});
Map/Reduce
{
url:
“/blog/something”,


user_id:
ObjectID(‘xxxxxx’),


date:
“Sat
Oct
16
2010
06:30:00
GMT+0530
(IST)”
}




                     Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
Map/Reduce
{
url:
“/blog/something”,


user_id:
ObjectID(‘xxxxxx’),


date:
“Sat
Oct
16
2010
06:30:00
GMT+0530
(IST)”
}

map
=
function()
{
  day
=
Date.UTC(this.date.getFullYear(),
  














this.date.getMonth(),this.date.getDate);
  emit({day:
day,
user_id:
this.user_id},{count:
1});
}




                     Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
Map/Reduce
{
url:
“/blog/something”,


user_id:
ObjectID(‘xxxxxx’),


date:
“Sat
Oct
16
2010
06:30:00
GMT+0530
(IST)”
}

map
=
function()
{
  day
=
Date.UTC(this.date.getFullYear(),
  














this.date.getMonth(),this.date.getDate);
  emit({day:
day,
user_id:
this.user_id},{count:
1});
}

reduce
=
function(key,values){
  var
count=0;
  values.forEach(function(v){
    count+=v;
  }
  return
{count:
count}
}



                     Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
Map/Reduce
{
url:
“/blog/something”,


user_id:
ObjectID(‘xxxxxx’),


date:
“Sat
Oct
16
2010
06:30:00
GMT+0530
(IST)”
}

map
=
function()
{
  day
=
Date.UTC(this.date.getFullYear(),
  














this.date.getMonth(),this.date.getDate);
  emit({day:
day,
user_id:
this.user_id},{count:
1});
}

reduce
=
function(key,values){
  var
count=0;
  values.forEach(function(v){
    count+=v;
  }
  return
{count:
count}
}

db.pageviews.mapReduce(map,reduce,{out:
pageview_results});
                     Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
Map/Reduce (contd)
{
_id:
{day:
“Sat
Oct
16
2010
00:00:00Z”,









user_id:
ObjectId(xxx)},


count:
20}




                     Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
Map/Reduce (contd)
{
_id:
{day:
“Sat
Oct
16
2010
00:00:00Z”,









user_id:
ObjectId(xxx)},


count:
20}

map
=
function()
{
  emit(this,{count:
1});
}




                     Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
Map/Reduce (contd)
{
_id:
{day:
“Sat
Oct
16
2010
00:00:00Z”,









user_id:
ObjectId(xxx)},


count:
20}

map
=
function()
{
  emit(this,{count:
1});
}

reduce
=
function(key,values){
  var
count=0;
  values.forEach(function(v){
    count+=v;
  }
  return
{count:
count}
}




                     Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
Map/Reduce (contd)
{
_id:
{day:
“Sat
Oct
16
2010
00:00:00Z”,









user_id:
ObjectId(xxx)},


count:
20}

map
=
function()
{
  emit(this,{count:
1});
}

reduce
=
function(key,values){
  var
count=0;
  values.forEach(function(v){
    count+=v;
  }
  return
{count:
count}
}

db.pageview_results.mapReduce(map,reduce,






























{out:
pageview_results_unique});
                     Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
GridFS (in Ruby)




    Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
GridFS (in Ruby)
@db
=
Mongo::Connection.new.db(“chennaigeeks”)
@fs
=
GridFileSystem.new(@db)




                     Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
GridFS (in Ruby)
@db
=
Mongo::Connection.new.db(“chennaigeeks”)
@fs
=
GridFileSystem.new(@db)

image
=
File.open(“me.png”)
@fs.open(“me.png”,’w’)
do
|f|
  f.write
image
end




                     Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
GridFS (in Ruby)
@db
=
Mongo::Connection.new.db(“chennaigeeks”)
@fs
=
GridFileSystem.new(@db)

image
=
File.open(“me.png”)
@fs.open(“me.png”,’w’)
do
|f|
  f.write
image
end

img
=
@fs.open(“me.png”,”r”)
{
|f|
f.read
}



                     Source: http://cookbook.mongodb.org/patterns/unique_items_map_reduce/
Replication (Master/Slave)
db@master
/opt/mongo/bin$
./mongod
‐‐master



db@slave
/opt/mongo/bin$
./mongod
‐‐slave
‐‐source
master
Replication (Replica Sets)
db@node1
/opt/mongo/bin$
./mongod
‐‐replSet
myRS

db@node2
/opt/mongo/bin$
./mongod
‐‐replSet
myRS

db@node3
/opt/mongo/bin$
./mongod
‐‐replSet
myRS

db@dev
/opt/mongo/bin$
./mongo
node1
MongoDB
shell
version:
1.6.0
connecting
to:
node1/test
>
config
=
{_id:
“myRS”,
members
:
[
                {_id:
0,
host:
“node1”},
                {_id:
0,
host:
“node2”},
                {_id:
0,
host:
“node3”}]}
>
rs.initiate(config);

>
rs.status()
Auto Sharding

db@node1
/opt/mongo/bin$
./mongod
‐‐shardsvr

db@node2
/opt/mongo/bin$
./mongod
‐‐shardsvr

db@node3
/opt/mongo/bin$
./mongod
‐‐configsvr

db@appserver
/opt/mongo/bin$
./mongos
‐‐configdb
node3
Auto Sharding (contd)
db@appserver
/opt/mongo/bin$
./mongo
MongoDB
shell
version:
1.6.0
connecting
to:
test
>
use
admin
switched
to
db
admin
>
db.runCommand({addShard
:
“node1”});
{
“shardadded”:
“shard0000”,
”ok”:
1}
>
db.runCommand({addShard
:
“node2”});
{
“shardadded”:
“shard0001”,
”ok”:
1}
>
db.runCommand(enableSharding
:
“mydb”)
{“ok”
:
1}
>
db.runCommand({
shardCollection
:
“mydb.people”,



















key
:
{name
:
1}
});
{“ok”
:
1
}
Any Questions?
vagmi@artha42.com
http://blog.chennaigeeks.com/

MongoDB - Introduction