mongodb advanced topics

35
MongoDB Advanced Topics CØsar D. Rodas [email protected] http://crodas.org/ Yahoo! Open Hack Day 2010 Sªo Paulo, Brasil 1

Upload: cesar-rodas

Post on 10-Dec-2014

12.463 views

Category:

Technology


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: MongoDB Advanced Topics

MongoDB Advanced Topics

César D. [email protected]

http://crodas.org/

Yahoo! Open Hack Day 2010São Paulo, Brasil

1

Page 2: MongoDB Advanced Topics

Who is this fellow?

� Paraguayan

� Zealot of• Open Source

• PHP

• MongoDB

� PECL Developer

� ... and few other things

@crodas - http://crodas.org/ - LATEX 2

Page 3: MongoDB Advanced Topics

I’d like to thanks to...

� 10gen

� Yahoo!

� My Brazilian friends

@crodas - http://crodas.org/ - LATEX 3

Page 4: MongoDB Advanced Topics

Agenda

� Introduction to MongoDB

� MongoDB Queries

� Real life example:• Designing data model for a Wordpress.com like site

• Optimize our data model to run in sharded environment

@crodas - http://crodas.org/ - LATEX 4

Page 5: MongoDB Advanced Topics

MongoDB

� <EN>Mongo</EN> != <PT>Mongo</PT>

� Document oriented database

� Fast, Scalable, Easy to use

� Support Indexes• Simple

• Compound

• Geo spatial

� Support sharding

� PECL client

@crodas - http://crodas.org/ - LATEX 5

Page 6: MongoDB Advanced Topics

Documents?

@crodas - http://crodas.org/ - LATEX 6

Page 7: MongoDB Advanced Topics

It’s just an Array()

@crodas - http://crodas.org/ - LATEX 7

Page 8: MongoDB Advanced Topics

In fact everything is anArray() in MongoDB

@crodas - http://crodas.org/ - LATEX 8

Page 9: MongoDB Advanced Topics

http://bit.ly/mongodb-php

@crodas - http://crodas.org/ - LATEX 9

Page 10: MongoDB Advanced Topics

The fun part

@crodas - http://crodas.org/ - LATEX 10

Page 11: MongoDB Advanced Topics

MongoDB - Operations

� Select• $gt, $lt, $gte, $lte, $eq, $neq: >, <, >=, <=, ==, !=

• $in, $nin

• $size, $exists

• $where: Any javascript expression

• group()

• limit()

• skip()

� Update• $set

• $unset

• $push

• $pull

• $inc

@crodas - http://crodas.org/ - LATEX 11

Page 12: MongoDB Advanced Topics

pecl install mongo

@crodas - http://crodas.org/ - LATEX 12

Page 13: MongoDB Advanced Topics

MongoDB - Connection

/* connects to localhost:27017 */$connection = new Mongo();

/* connect to a remote host (default port) */$connection = new Mongo( "example.com" );

/* connect to a remote host at a given port */$connection = new Mongo( "example.com:65432" );

/* select some DB (and create if it doesn’t exits yet) */$db = $connection->selectDB("db name");

/* select a "table" (collection) */$table = $db->getCollection("table");

@crodas - http://crodas.org/ - LATEX 13

Page 14: MongoDB Advanced Topics

FROM SQL to MongoDB

@crodas - http://crodas.org/ - LATEX 14

Page 15: MongoDB Advanced Topics

MongoDB - Count

/* SELECT count(*) FROM table */$collection->count();

/* SELECT count(*) FROM table WHERE foo = 1 */$collection->find(array("foo" => 1))->count();

@crodas - http://crodas.org/ - LATEX 15

Page 16: MongoDB Advanced Topics

MongoDB - Queries

/** SELECT * FROM table WHERE field IN (5,6,7) and enable=1* and worth < 5* ORDER BY timestamp DESC*/

$collection->ensureIndex(array(’field’=>1, ’enable’=>1, ’worth’=>1, ’timestamp’=>-1)

);

$filter = array(’field’ => array(’$in’ => array(5,6,7)),’enable’ => 1,’worth’ => array(’$lt’ => 5)

);$results = $collection->find($filter)->sort(array(’timestamp’ => -1));

@crodas - http://crodas.org/ - LATEX 16

Page 17: MongoDB Advanced Topics

MongoDB - Pagination

/** SELECT * FROM table WHERE field IN (5,6,7) and enable=1* and worth < 5* ORDER BY timestamp DESC LIMIT $offset, 20*/$filter = array(

’field’ => array(’$in’ => array(5,6,7)),’enable’ => 1,’worth’ => array(’$lt’ => 5)

);

$cursor = $collection->find($filter);$cursor->sort(array(’timestamp’ => -1))->skip($offset)->limit(20);

foreach ($cursor as $result) {var dump($result);

}

@crodas - http://crodas.org/ - LATEX 17

Page 18: MongoDB Advanced Topics

Designing data structureSimple multi-blog system

@crodas - http://crodas.org/ - LATEX 18

Page 19: MongoDB Advanced Topics

MongoDB - Collections

� Blog

� Post

� User

� Comment

@crodas - http://crodas.org/ - LATEX 19

Page 20: MongoDB Advanced Topics

Blog document

$blog = array("user" => <userref>,"title" => "Foo bar blog""url" => array(

"foobar.foobar.com","anotherfoo.foobar.com",

),"permissions" => array(

"edit" => array(<userref>, <userref>));"post" => 1,...

);

@crodas - http://crodas.org/ - LATEX 20

Page 21: MongoDB Advanced Topics

Post document

$post = array("blog" => <blogref>,"author" => <userref>,"uri" => "/another-post","title" => "Another post","excerpt" => "bla, bla, bla","body" => "bar, foo bar, foo, bar","tags" => array("list", "of tags"),"published" => true,"date" => <mongodate>,

);

@crodas - http://crodas.org/ - LATEX 21

Page 22: MongoDB Advanced Topics

Missing docs.

$comment = array("post" => <postref>,"name" => "foobar","email" => "[email protected]","comment" => "Hello world","date" => <mongodate>,

);

$user = array("user" => "crodas","email" => "[email protected]","password" => "a1bad96dc68f891ca887d50eb3fb65ec82123d05","name" => "Cesar Rodas",

);

@crodas - http://crodas.org/ - LATEX 22

Page 23: MongoDB Advanced Topics

About indexes

$blog col->ensureIndex(array("url" => 1));

$post col->ensureIndex(array("blog" => 1, "date" => -1));$post col->ensureIndex(array("blog" => 1, "uri" => 1), array("unique" => 1));

$comment col->ensureIndex(array("post" => 1, "date" => -1));

$user col->ensureIndex(array("user" => 1), array("unique" => 1));$user col->ensureIndex(array("email" => 1), array("unique" => 1));

@crodas - http://crodas.org/ - LATEX 23

Page 24: MongoDB Advanced Topics

That’s it.

@crodas - http://crodas.org/ - LATEX 24

Page 25: MongoDB Advanced Topics

Hum...

@crodas - http://crodas.org/ - LATEX 25

Page 26: MongoDB Advanced Topics

Until now, nothing new

@crodas - http://crodas.org/ - LATEX 26

Page 27: MongoDB Advanced Topics

Let’s shard it!

@crodas - http://crodas.org/ - LATEX 27

Page 28: MongoDB Advanced Topics

Strategy

� Shard Blog collection

� Shard User collection

� Other collections are isolated• Create namespaces for post and comments (foo.post, foo.comments)

• Modify Blog collection, add info about "namespace" (and DB).

� MongoDB will distribute our DB and namespaces

@crodas - http://crodas.org/ - LATEX 28

Page 29: MongoDB Advanced Topics

Configuring the sharding

/* Assuming you have already MongoDB running* on a sharded env., you should do this once.** $admin is a connection to the "admin" DB.*/$admin->command(array(

"shardcollection" => "blog","key" => array("uri" => 1),

));

$admin->command(array("shardcollection" => "user","key" => array("user" => 1),"unique" => true,

));

@crodas - http://crodas.org/ - LATEX 29

Page 30: MongoDB Advanced Topics

New blog document

$blog = array("user" => <userref>,"title" => "Foo bar blog""url" => array(

"foobar.foobar.com","anotherfoo.foobar.com",

),"permissions" => array(

"edit" => array(<userref>, <userref>));"post" => 1,"namespace" => "3h3g3k3","database" => "34fs321",

);

@crodas - http://crodas.org/ - LATEX 30

Page 31: MongoDB Advanced Topics

Select the DB and namespaceto use "post" and "comments"

@crodas - http://crodas.org/ - LATEX 31

Page 32: MongoDB Advanced Topics

Questions?

@crodas - http://crodas.org/ - LATEX 32

Page 33: MongoDB Advanced Topics

Thank you hackers!

@crodas - http://crodas.org/ - LATEX 33

Page 34: MongoDB Advanced Topics

MongoDB is looking fromBrazilian help.

@crodas - http://crodas.org/ - LATEX 34

Page 35: MongoDB Advanced Topics

@crodas

crodas.org

@crodas - http://crodas.org/ - LATEX 35