How to use MongoDB
   with CakePHP

          2010/9/4
         Cakefest2010


       Yasushi Ichikawa
TOPIC

1. Who am I
2. MongoDB
3. PHP + MongoDB
4. CakePHP + MongoDB
Yasushi Ichikawa
Twitter: @ichikaway

Call me ichi
My Code
•    I've used Cakephp since Aug 2008.
•    Author of the SQL Explain Component
    → One of Debug_kit Contributors
•    Author of the Cakephp MongoDB-Datasource
My Code


    My code for Cakephp
    
        http://github.com/ichikaway
TOPIC

1. Who am I
2. MongoDB
3. PHP + MongoDB
4. CakePHP + MongoDB
MongoDB is
One of NoSQL
MongoDB
•    Open-source non-relational DB
•    C++
•    GNU AGPL v3.0
•    Many Drivers(PHP, Perl, Ruby, etc)
    – Apache License
•    Company: 10gen
• Download (version 1.6.2)
    – http://www.mongodb.org/display/DOCS/Downloads
MongoDB TERMs

 RDB       MongoDB

Table      Collection

 Row       Document

Column       Field
MongoDB Position




• Performance
  – Key/Value > mongoDB >>> RDBMS
• Functionality
  – RDBMS > mongoDB >>> Key/Value
MongoDB Provides


• Scalability
• Queryable
• Read/Write FAST
• Schema Free
MongoDB Schema

• Document: bson (similar json)
 – Binary data
• Schema Free
 – different schema in same collection
                            Id, title, body

                          Id, name, tel, fax

                      Id, name, nickname, email

                           Posts collection
MongoDB Schema

• Embedded Object
                  Posts collection

  id: 1, name: ichikaway, tel: 090-1111-2222. fax:
          Address                  skill
      Country: Japan,          Java: 2years,
      Zip: 222-3333            PHP: 3years

  id: 2, name: Yasushi, tel: 090-3333-4444. fax:
   id: 3, name: Ninjaaa, tel: 090-5555-6666. fax:
RDB Schema
• RDB schema
   • Natural data structure??
  Screen
Blog                    Blog table   Tags table

Title                   Title        Tag1
Text                    Text         Tag2
                                     Tag3
tag1,tag2,tag3    RDB
                                 Comment Table
Comment1
Comment2                         Comment1
Comment3                         Comment2
                                 Comment3
MongoDB schema
• Schema Free
  – Natural data structure
  Screen
Blog                     Blog collection
Title                    Title : xxxx
Text                     Text : yyyy
tag1,tag2,tag3   Mongo   Tag: [tag1,tag2,tag3]
                         Comment:
                         [comment1,
Comment1                   comment2,
Comment2                   comment3
Comment3                 ]
MongoDB In Production




github, heroku(MongoHQ), etc
MongoDB Production Case
• Business insider
• http://www.businessinsider.com/how-we-use-mongodb-2009-11

• Over 600,000 PV / business day
• 3 apache + 1 mongoDB
• MongoDB uses under 5% cpu time
MongoDB Fit or Not




Not replace all RDBMS
MongoDB Not FIT
 • Need Join
 • Need Transaction
 • Small disk space
    – each record has field label data
                         Posts collection
        id: 1, name: ichikaway, tel: 090-1111-2222. fax:

6bytes id: 2,   name: Yasushi, Age: 20 . Tel: 111-2222
        id: 3, name: Ninjaaa, Language: Japanese
MongoDB Fit
• Need Performance
  – Read/Write is fast
• Scale out
  – Master/Slave
  – Replica set(Automatic Failover)
  – Sharding
How to use
MongoDB Retrieving Data

SELECT field1, field2 From blog WHERE field1 = 'aaa';



db.blog.find( { field1 : ”aaa” }, { field1 : 1, field2 : 1 } )



  Collection name
MongoDB Retrieving Data

SELECT * WHERE field1 > 3
ORDER BY field2 DESC
LIMIT 10, 20;


db.collection.find( { field1 : { $gt:3 } } )
.sort(field2: -1)
.skip(10)
.limit(20);
MongoDB find operators
• $gt, $gte
• $lt, $lte
• $ne
• $in
• $nin
• $or

              http://www.mongodb.org/display/DOCS/Advanced+Queries
MongoDB find tips
•    Regular Expressions
    – { name : /ichikawa.*sushi/i }
•    Embedded Object
    – { "author.name" : "ichikawa" }
                                      Blog collection
                                      Title : xxxx
                                      Text : yyyy
                                      author:
                                      {
                                        name : 'ichikawa',
                                        age : 15
                                      }
MongoDB




DEMO
SQL to Mongo Mapping Chart
http://www.mongodb.org/display/DOCS/SQL+to+Mongo+
Mapping+Chart
MongoDB Indexing
Create Index
db.collection.ensureIndex({“title” : 1})
Delete Index
db.collection.dropIndex({“title” : 1})
Create Embedded Doc Index
db.collection.ensureIndex
({“Autor.name” : 1})
Create Index(Background)
db.collection.ensureIndex
({“title” : 1}, {background:true} )
Cool Stuffs of MongoDB



Geospatial Index
Capped Collection
MongoDB Geospatial Index


    Version 1.3.3+ , recommend 1.6.2+ (Bug fix)

    Calculate location data
    – Latitude(緯度), Longitude(経度)

    find the closest location with Operators
    – $near: sort from the closest point
    – $box: find points within the rectangle
    – $center: find points within the circle
MongoDB Geospatial Index



    Insert data
    db.geotest.save({ loc:[ 35, 139 ] })
                        Latitude Longitude


    create Index
    db.geotest.ensureIndex( {loc:”2d”} )
MongoDB Geospatial Index



    Find the point
    db.geotest.find({ loc:[35, 140] });



    $near
    db.geotest.find({ loc:{ $near : [30, 130] } })
MongoDB Geospatial Index

    $box
    – lower left, upper right
     db.geotest.find({ loc:{ $within:{ $box:
      [[1, 1], [10,10]] }}});

    $center
    – set radius(degree)
     db.geotest.find({ loc:{
       $within:{ $center:       [[10, 10], 0.1 ] }
                                          radius(degree)
      }})
MongoDB Geospatial Index




     DEMO
MongoDB Capped Collection


  Creating a Fixed Size (capped) Collection

  Not think about data space / overflow
• Age out data is deleted when Collection is full
• Good for
    – Logging
    – Caching


 db.createCollection("testcap1", {capped: true, size:5000});
MongoDB Attension




    32bit version limitation
    –can't save data over 2Gbytes
MongoDB Books




      http://www.mongodb.org/display/DOCS/Books
TOPIC

1. Who am I
2. MongoDB
3. PHP + MongoDB
4. CakePHP + MongoDB
Pecl Mongo Driver

• Apache License
• Setup
 pecl install mongo
 extension=mongo.so (php.ini)
• Manual
 –http://us2.php.net/mongo
Pecl Mongo
•   Connect
     $mongo = new Mongo(localhost:27017);
     $db = $mongo->selectDB('blog');

•   select collection
    $collection = $db->selectCollection('posts');
•   Find
    $collection->find($cond, $filed)
         ->sort()->limit(5)->skip();
Pecl Mongo
    $data = array('field1' => 'val1',
                  'field2' => 'val2');
•    Insert
    $collection->insert($data);

•    Update
    $new = array('$set' => array('field2' => 'aa'));
    $cond = array('field1' => 'val1');
    $collection->update($cond, $new);
TOPIC

1. Who am I
2. MongoDB
3. PHP + MongoDB
4. CakePHP + MongoDB
MongoDB Datasource

    Developed since Jan, 2010

    PHP5+

    Pecl Mongo

    CakePHP1.2+
     – Recommend Cake1.3
MongoDB Datasource

    Version 0.3
      – set schema info to Model::schema
      – test cases

    Version 0.4
      – create schema info from Post data
      – show command log

        Huge Thanks AD7six
Cake Datasource

  The link between models and the
  source(DB)

  Transparency
    – Use Mongo from Model methods
    – connect to MongoDB and use
       collection automatically
Cake calls Datasource methods

 Model Method   Datasource

    find()        read()

    save()       create()

    save()       update()

   delete()      delete()
Let's use
Setup

  cd app/plugins

  git clone
  http://github.com/ichikaway/mongoDB-
  Datasource.git mongodb

  cd app/config

  vi database.php
database.php

<?php
class DATABASE_CONFIG {
 public $default = array(
   'driver' => 'mongodb.mongodbSource',
   'database' => 'cakemongo1',
   'host' => 'localhost',
   'port' => 27017,
 );
Sample Cake Mongo




   DEMO
 Sample1
Sample2
Sample Cake Mongo part 2

    Delete History
      
         Main data is stored in MySQL
      
         save deleted records in history table
      
         search history records
Sample Cake Mongo part 2

                      MySQL
  App             Default Schema
CakePHP
               Post table   User table
Sample Cake Mongo part 2

    RDB way
     
          copy schema(all table)
Sample Cake Mongo part 2

                                MySQL
  App                        Default Schema
CakePHP
                          Post table   User table
              1. Delete


                              Copy Schema

                          Post table   User table
    2. save
Sample Cake Mongo part 2

    RDB way
     
          copy schema(all table)
            
                Hard to maintain both schema
     
          serialize deleted record, save in history table
            
                Hard to search in history table
Sample Cake Mongo 2




Mongo Way
Sample Cake Mongo part 2

                               MySQL
  App                       Default Schema
CakePHP
                         Post table   User table
             1. Delete

                             MongoDB
                           History Collection
                         {'post' : Post record}
   2. save               {'user' : User record}
Sample Cake Mongo 2




    DEMO
Sample Cake Mongo 2

    Good Fit Document Database
      –   save different table records in one collection

    Don't need prepare schema before Save

    Search easily in History Collection
Summary

    MongoDB
- Good case
- Query
- Geospatial Index
- Capped Collection

    PHP + MongoDB

    CakePHP + MongoDB
Thank you!
     Questions?
Please, speak slowly :)

How to use MongoDB with CakePHP

  • 1.
    How to useMongoDB with CakePHP 2010/9/4 Cakefest2010 Yasushi Ichikawa
  • 2.
    TOPIC 1. Who amI 2. MongoDB 3. PHP + MongoDB 4. CakePHP + MongoDB
  • 3.
  • 4.
    My Code • I've used Cakephp since Aug 2008. • Author of the SQL Explain Component → One of Debug_kit Contributors • Author of the Cakephp MongoDB-Datasource
  • 5.
    My Code  My code for Cakephp  http://github.com/ichikaway
  • 6.
    TOPIC 1. Who amI 2. MongoDB 3. PHP + MongoDB 4. CakePHP + MongoDB
  • 7.
  • 8.
    MongoDB • Open-source non-relational DB • C++ • GNU AGPL v3.0 • Many Drivers(PHP, Perl, Ruby, etc) – Apache License • Company: 10gen • Download (version 1.6.2) – http://www.mongodb.org/display/DOCS/Downloads
  • 9.
    MongoDB TERMs RDB MongoDB Table Collection Row Document Column Field
  • 10.
    MongoDB Position • Performance – Key/Value > mongoDB >>> RDBMS • Functionality – RDBMS > mongoDB >>> Key/Value
  • 11.
    MongoDB Provides • Scalability •Queryable • Read/Write FAST • Schema Free
  • 12.
    MongoDB Schema • Document:bson (similar json) – Binary data • Schema Free – different schema in same collection Id, title, body Id, name, tel, fax Id, name, nickname, email Posts collection
  • 13.
    MongoDB Schema • EmbeddedObject Posts collection id: 1, name: ichikaway, tel: 090-1111-2222. fax: Address skill Country: Japan, Java: 2years, Zip: 222-3333 PHP: 3years id: 2, name: Yasushi, tel: 090-3333-4444. fax: id: 3, name: Ninjaaa, tel: 090-5555-6666. fax:
  • 14.
    RDB Schema • RDBschema • Natural data structure?? Screen Blog Blog table Tags table Title Title Tag1 Text Text Tag2 Tag3 tag1,tag2,tag3 RDB Comment Table Comment1 Comment2 Comment1 Comment3 Comment2 Comment3
  • 15.
    MongoDB schema • SchemaFree – Natural data structure Screen Blog Blog collection Title Title : xxxx Text Text : yyyy tag1,tag2,tag3 Mongo Tag: [tag1,tag2,tag3] Comment: [comment1, Comment1 comment2, Comment2 comment3 Comment3 ]
  • 16.
    MongoDB In Production github,heroku(MongoHQ), etc
  • 17.
    MongoDB Production Case •Business insider • http://www.businessinsider.com/how-we-use-mongodb-2009-11 • Over 600,000 PV / business day • 3 apache + 1 mongoDB • MongoDB uses under 5% cpu time
  • 18.
    MongoDB Fit orNot Not replace all RDBMS
  • 19.
    MongoDB Not FIT • Need Join • Need Transaction • Small disk space – each record has field label data Posts collection id: 1, name: ichikaway, tel: 090-1111-2222. fax: 6bytes id: 2, name: Yasushi, Age: 20 . Tel: 111-2222 id: 3, name: Ninjaaa, Language: Japanese
  • 20.
    MongoDB Fit • NeedPerformance – Read/Write is fast • Scale out – Master/Slave – Replica set(Automatic Failover) – Sharding
  • 21.
  • 22.
    MongoDB Retrieving Data SELECTfield1, field2 From blog WHERE field1 = 'aaa'; db.blog.find( { field1 : ”aaa” }, { field1 : 1, field2 : 1 } ) Collection name
  • 23.
    MongoDB Retrieving Data SELECT* WHERE field1 > 3 ORDER BY field2 DESC LIMIT 10, 20; db.collection.find( { field1 : { $gt:3 } } ) .sort(field2: -1) .skip(10) .limit(20);
  • 24.
    MongoDB find operators •$gt, $gte • $lt, $lte • $ne • $in • $nin • $or http://www.mongodb.org/display/DOCS/Advanced+Queries
  • 25.
    MongoDB find tips • Regular Expressions – { name : /ichikawa.*sushi/i } • Embedded Object – { "author.name" : "ichikawa" } Blog collection Title : xxxx Text : yyyy author: { name : 'ichikawa', age : 15 }
  • 26.
  • 27.
    SQL to MongoMapping Chart http://www.mongodb.org/display/DOCS/SQL+to+Mongo+ Mapping+Chart
  • 28.
    MongoDB Indexing Create Index db.collection.ensureIndex({“title”: 1}) Delete Index db.collection.dropIndex({“title” : 1}) Create Embedded Doc Index db.collection.ensureIndex ({“Autor.name” : 1}) Create Index(Background) db.collection.ensureIndex ({“title” : 1}, {background:true} )
  • 29.
    Cool Stuffs ofMongoDB Geospatial Index Capped Collection
  • 30.
    MongoDB Geospatial Index  Version 1.3.3+ , recommend 1.6.2+ (Bug fix)  Calculate location data – Latitude(緯度), Longitude(経度)  find the closest location with Operators – $near: sort from the closest point – $box: find points within the rectangle – $center: find points within the circle
  • 31.
    MongoDB Geospatial Index  Insert data db.geotest.save({ loc:[ 35, 139 ] }) Latitude Longitude  create Index db.geotest.ensureIndex( {loc:”2d”} )
  • 32.
    MongoDB Geospatial Index  Find the point db.geotest.find({ loc:[35, 140] });  $near db.geotest.find({ loc:{ $near : [30, 130] } })
  • 33.
    MongoDB Geospatial Index  $box – lower left, upper right db.geotest.find({ loc:{ $within:{ $box: [[1, 1], [10,10]] }}});  $center – set radius(degree) db.geotest.find({ loc:{ $within:{ $center: [[10, 10], 0.1 ] } radius(degree) }})
  • 34.
  • 35.
    MongoDB Capped Collection  Creating a Fixed Size (capped) Collection  Not think about data space / overflow • Age out data is deleted when Collection is full • Good for – Logging – Caching db.createCollection("testcap1", {capped: true, size:5000});
  • 36.
    MongoDB Attension  32bit version limitation –can't save data over 2Gbytes
  • 37.
    MongoDB Books http://www.mongodb.org/display/DOCS/Books
  • 38.
    TOPIC 1. Who amI 2. MongoDB 3. PHP + MongoDB 4. CakePHP + MongoDB
  • 39.
    Pecl Mongo Driver •Apache License • Setup pecl install mongo extension=mongo.so (php.ini) • Manual –http://us2.php.net/mongo
  • 40.
    Pecl Mongo • Connect $mongo = new Mongo(localhost:27017); $db = $mongo->selectDB('blog'); • select collection $collection = $db->selectCollection('posts'); • Find $collection->find($cond, $filed) ->sort()->limit(5)->skip();
  • 41.
    Pecl Mongo $data = array('field1' => 'val1', 'field2' => 'val2'); • Insert $collection->insert($data); • Update $new = array('$set' => array('field2' => 'aa')); $cond = array('field1' => 'val1'); $collection->update($cond, $new);
  • 42.
    TOPIC 1. Who amI 2. MongoDB 3. PHP + MongoDB 4. CakePHP + MongoDB
  • 43.
    MongoDB Datasource  Developed since Jan, 2010  PHP5+  Pecl Mongo  CakePHP1.2+ – Recommend Cake1.3
  • 44.
    MongoDB Datasource  Version 0.3 – set schema info to Model::schema – test cases  Version 0.4 – create schema info from Post data – show command log Huge Thanks AD7six
  • 45.
    Cake Datasource  The link between models and the source(DB)  Transparency – Use Mongo from Model methods – connect to MongoDB and use collection automatically
  • 46.
    Cake calls Datasourcemethods Model Method Datasource find() read() save() create() save() update() delete() delete()
  • 47.
  • 48.
    Setup  cdapp/plugins  git clone http://github.com/ichikaway/mongoDB- Datasource.git mongodb  cd app/config  vi database.php
  • 49.
    database.php <?php class DATABASE_CONFIG { public $default = array( 'driver' => 'mongodb.mongodbSource', 'database' => 'cakemongo1', 'host' => 'localhost', 'port' => 27017, );
  • 50.
    Sample Cake Mongo DEMO Sample1
  • 51.
  • 52.
    Sample Cake Mongopart 2  Delete History  Main data is stored in MySQL  save deleted records in history table  search history records
  • 53.
    Sample Cake Mongopart 2 MySQL App Default Schema CakePHP Post table User table
  • 54.
    Sample Cake Mongopart 2  RDB way  copy schema(all table)
  • 55.
    Sample Cake Mongopart 2 MySQL App Default Schema CakePHP Post table User table 1. Delete Copy Schema Post table User table 2. save
  • 56.
    Sample Cake Mongopart 2  RDB way  copy schema(all table)  Hard to maintain both schema  serialize deleted record, save in history table  Hard to search in history table
  • 57.
    Sample Cake Mongo2 Mongo Way
  • 58.
    Sample Cake Mongopart 2 MySQL App Default Schema CakePHP Post table User table 1. Delete MongoDB History Collection {'post' : Post record} 2. save {'user' : User record}
  • 59.
  • 60.
    Sample Cake Mongo2  Good Fit Document Database – save different table records in one collection  Don't need prepare schema before Save  Search easily in History Collection
  • 61.
    Summary  MongoDB - Good case - Query - Geospatial Index - Capped Collection  PHP + MongoDB  CakePHP + MongoDB
  • 62.
    Thank you! Questions? Please, speak slowly :)