0% found this document useful (0 votes)
88 views35 pages

Mongodb Advanced Topics: César D. Rodas

César D. Rodas gives a presentation on advanced MongoDB topics at Yahoo! Open Hack Day 2010 in São Paulo, Brazil. The presentation introduces MongoDB and documents, demonstrates queries and operations, and discusses designing a data model for a blog system and optimizing it for sharding across multiple servers. The presentation also includes a question and answer session.

Uploaded by

Sarvesh Maddy
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
88 views35 pages

Mongodb Advanced Topics: César D. Rodas

César D. Rodas gives a presentation on advanced MongoDB topics at Yahoo! Open Hack Day 2010 in São Paulo, Brazil. The presentation introduces MongoDB and documents, demonstrates queries and operations, and discusses designing a data model for a blog system and optimizing it for sharding across multiple servers. The presentation also includes a question and answer session.

Uploaded by

Sarvesh Maddy
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 35

MongoDB Advanced Topics

César D. Rodas
crodas@php.net
http://crodas.org/

Yahoo! Open Hack Day 2010


São Paulo, Brasil

1
Who is this fellow?
Paraguayan
Zealot of
• Open Source
• PHP
• MongoDB

PECL Developer
... and few other things

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


I'd like to thanks to...

10gen

Yahoo!

My Brazilian friends

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


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


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


Documents?

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


It's just an Array()

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


In fact everything is an
Array() in MongoDB

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


http://bit.ly/mongodb-php

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


The fun part

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


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


pecl install mongo

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


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


FROM SQL to MongoDB

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


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


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


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


Designing data structure
Simple multi-blog system

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


MongoDB - Collections
Blog
Post
User
Comment

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


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


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


Missing docs.
$comment = array(
"post" => <postref>,
"name" => "foobar",
"email" => "foo@bar.com",
"comment" => "Hello world",
"date" => <mongodate>,
);

$user = array(
"user" => "crodas",
"email" => "crodas@php.net",
"password" => "a1bad96dc68f891ca887d50eb3fb65ec82123d05",
"name" => "Cesar Rodas",
);

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


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


That's it.

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


Hum...

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


Until now, nothing new

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


Let's shard it!

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


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


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


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


Select the DB and namespace
to use "post" and "comments"

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


Questions?

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


Thank you hackers!

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


MongoDB is looking from
Brazilian help.

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


@crodas

crodas.org

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

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy