SlideShare a Scribd company logo
MongoSF - PHP Development With MongoDB
        Presented By: Fitz Agard - LightCube Solutions LLC

                          April 30, 2010
Introductions - Who is this guy?
{ “name”: “Fitz Agard”,
  “description”: [“Developer”,”Consultant”,”Data Junkie”, “Educator”, “Engineer”],
  “location”: “New York”,
  “companies”:[
        {“name”: “LightCube Solutions”, “url”: “www.lightcubesolutions.com”}
  ],
  “urls”:[
        {“name”: “LinkedIn”, “url”: “http://www.linkedin.com/in/fitzagard”},
        {“name”: “Twitter”, “url”: “http://www.twitter.com/fitzhagard”}
  ],
  “email”: “fhagard@lightcube.us”
}




               (If the above formatting confused you please see - http://json.org/)
Why PHP Developers Should Use MongoDB?

            PHP Reasons                                                 Database Reasons
•   Enhanced Development Cycle - Itʼs no longer           •   Document-oriented storage - JSON-style documents with dynamic
    necessary to go back and forth between the Database       schemas offer simplicity and power.
    Schema and Object.                                    •   Full Index Support - Index on any attribute.
•   Easy Ramp-Up - Queries are just an array away.        •   Replication & High Availability - Mirror across LANs and WANs.
•   No Need For ORM - No Schema!                          •   Auto-Sharding - Scale horizontally without compromising functionality.
•   DBA? What DBA?                                        •   Querying - Rich, document-based queries.
•   Arrays, Array, Arrays!                                •   Fast In-Place Updates - Atomic modifiers for contention-free
                                                              performance.
                                                          •   Map/Reduce - Flexible aggregation and data processing.
                                                          •   GridFS - Store files of any size.
Mongo and PHP in a Nutshell
                 http://us.php.net/manual/en/book.mongo.php




Common Methods                    Conditional Operators
   •   find()                                     •   $ne
   •   findOne()                                  •   $in
   •   save()                                    •   $nin
   •   remove()                                  •   $mod
   •   update()                                  •   $all
   •   group()                                   •   $size
   •   limit()                                   •   $exists
   •   skip()                                    •   $type
   •   ensureIndex()                             •   $gt
   •   count()                                   •   $lt
   •   ...And More                               •   $lte
                                                 •   $gte
Mongo and PHP in a Nutshell
                                                 (Connectivity)
                                  http://us2.php.net/manual/en/mongo.connecting.php



function __construct()
{
    global $dbname, $dbuser, $dbpass;
    $this->dbname = $dbname;
    $this->dbuser = $dbuser;
    $this->dbpass = $dbpass;

    // Make the initial connection
    try {
        $this->_link = new Mongo();
        // Select the DB
        $this->db = $this->_link->selectDB($this->dbname);
        // Authenticate
        $result = $this->db->authenticate($this->dbuser, $this->dbpass);
        if ($result['ok'] == 0) {
            // Authentication failed.
            $this->error = ($result['errmsg'] == 'auth fails') ? 'Database Authentication Failure' : $result['errmsg'];
            $this->_connected = false;
        } else {
            $this->_connected = true;
        }
    } catch (Exception $e) {
        $this->error = (empty($this->error)) ? 'Database Connection Error' : $this->error;
    }
}
Mongo and PHP in a Nutshell
                                       (Simple Queries)
                           http://us2.php.net/manual/en/mongo.queries.php


	   /*
	    * SELECT * FROM students
	    * WHERE isSlacker = true
	    * AND postalCode IN (10466,10407,10704)
	    * AND gradYear BETWEEN (2010 AND 2014)
	    * ORDER BY lastName DESC
	    */
	   $collection = $this->db->students;
	   $collection->ensureIndex(array('isSlacker'=>1, 'postalCode'=>1, 'lastName'=>1, 'gradYear'=>-1));
	
	   $conditions = array('postalCode'=>array('$in'=>array(10466,10407,10704)),
	   	   	    	   	   	   'isSlacker'=>true,
	   	   	    	   	   	   'gradYear'=>array('$gt'=>2010, '$lt'=>2014));
	
	   $results = $collection->find($conditions)->sort(array('lastName'=>1));
	
	   $collection = $this->db->grades;
	
	   //SELECT count(*) FROM grades
	   $total = $collection->count();
	
	   //SELECT count(*) FROM grades WHERE grade = 90
	   $smartyPants = $collection->find(array("grade"=>90))->count();
Mongo and PHP in a Nutshell
                                              (Using GridFS)
                               http://us2.php.net/manual/en/class.mongogridfs.php

    $m = new Mongo();
	
	   //select Mongo Database
	   $db = $m->selectDB("studentsystem");
	
	   //use GridFS class for handling files
	   $grid = $db->getGridFS();
	
	   //Optional - capture the name of the uploaded file
	   $name = $_FILES['Filedata']['name'];
	
	   //load file into MongoDB and get back _id
	   $id = $grid->storeUpload('Filedata',$name);
	
	   //set a mongodate
	   $date = new MongoDate();
	
	   //Use $set to add metadata to a file
	   $metaData = array('$set' => array("comment"=>"This looks like a MongoDB Student", "date"=>$date));
	
	   //Just setting up search criteria
	   $criteria = array('_id' => $id);
	
	   //Update the document with the new info
	   $db->grid->update($criteria, $metaData);
Mongo and PHP in a Nutshell
                       (Using GridFS)


	    public function remove($criteria)
	    {
	        //Get the GridFS Object
	        $grid = $this->db->getGridFS();
	
	        //Setup some criteria to search for file
	        $id = new MongoID($criteria['_id']);
	
	        //Remove file
	        $grid->remove(array('_id'=>$id), true);
	
	        //Get lastError array
	        $errorArray = $db->lastError();
	        if ($errorArray['ok'] == 1 ) {
	            $retval = true;
	        }else{
	            //Send back the error message
	            $retval = $errorArray['err'];
	        } 	
	        return $retval;
	    }
Let’s develop a simple student information capture
         system with mongoDB and PHP!
Typical Development Cycle



          Design




  Test             Develop
Typical Design
                         Design




   (The Schema)
                  Test            Develop
Our Design
                                                                  Design




                           (The Mongo Model)
                                                           Test            Develop

             db.students             db.teachers


firstName:                  firstName:
lastName:                  lastName:
address:                   isCrazy:

    address:
    city:
    state:
    postalCode:
                                       db.courses

grades:
                           name:
    grade:                 isImpossible:
    course:                teacher:
    createdDate:
    modifiedDate:
    comment:


schedule:
    course:

sysInfo:                      Whiteboards aren’t this neat but they
                                       are just as good!
    username:
    password:


isSlacker:

gradYear:
Some Wireframes
                                                                                                                                                              Design




                                                                                                (The View)
                                                                                                                                                   Test                Develop




                                                                                                              Select Course:    - Select One -   * Required


            User Name:                                                             * Required                 Select Student:   - Select One -   * Required

              Password:     *****************                                      * Required
                                                                                                                      Grade:

            First Name:                                                            * Required

                                                                                                                                                   Submit

             Last Name:                                                            * Required




               Address:                                                            * Required



City, State, Postal Code:   City                                  - State -   Postal Code        * Required




                             Click if this student is a slacker                                                         Imagine the code for this
      Graduation Date:      mm/dd/yyyy



                                                                               Submit
Design




                                    We’re Developing
                                                                                             Test            Develop



public function studentUpdate()
	    {
	    	   $mongo_id = new MongoID($_POST['_id']);	
	    	
	    	   $data = $this->cleanupData($_POST);
	    	
	    	   $this->col->update(array("_id" => $mongo_id), array('$push' => $data));
	    	
	    	   return;
                                                  	
	    }
                                                 $_POST = '4b7c29908ead0e2e1d000000';
                                                 $data = array('firstName'=>'Fitz',
                                                 	   	    	   	   	   'lastName'=>'Agard',
                                                 	   	    	   	   	   'address'=>array(
                                                 	   	    	   	   	   	    'address'=>'123 Data Lane',
                                                 	   	    	   	   	   	    'state'=>'New York',
Letʼs assume cleanupData only removes            	   	    	   	   	   	    'postalCode'=>10704
unnecessary POST elements like the _id           	   	    	   	   	   	    ),
                                                 	   	    	   	   	   'sysInfo'=>array(
                                                 	   	    	   	   	   	    'username'=>'fhagard',
                                                 	   	    	   	   	   	    'password'=>sha1('MongoW00t')
                                                 	   	    	   	   	   	    ),
                                                 	   	    	   	   	   'isSlacker'=>true,
                                                 	   	    	   	   	   'gradYear'=>2003
                                                 	   	    	   	   	   );
Design




                                      We’re Developing
                                                                                               Test            Develop



  public function studentUpdate()
  	    {
  	    	   $mongo_id = new MongoID($_POST['_id']);	
  	    	
  	    	   $data = $this->cleanupData($_POST);
  	    	
  	    	   $this->col->update(array("_id" => $mongo_id), array('$push' => $data));
  	    	
  	    	   return;
  	    }




                                             $_POST = '4b7c29908ead0e2e1d000000';
                                             $data = array('grades'=>array(
                                                            'grade'=>'3.8',
                                                            'course'=>'4bd0dd44cc93740f3e00251c',
                                                            'createDate'=>new MongoDate()));



Donʼt forget that cleanupData only removes
 unnecessary POST elements like the _id
Design




                                                                        Test             Develop




Problem: The client called and asked why we forgot
   to collect “student infractions” in our design.


                      oops!


                              “oops” - used typically to express mild apology, surprise, or dismay.
Development back to Design
                                                                             Design




                                  (“oops” is easily fixed)
                                                                      Test            Develop
             db.students


firstName:
lastName:
address:

    address:
    city:
    state:
    postalCode:                               infractions:

grades:                                            desc:
    grade:                                         date:
    course:
    createdDate:
    modifiedDate:
    comment:


schedule:
    course:

sysInfo:

    username:
    password:
                                              Back to the whiteboard
                                        (or - napkin, omnigraffle, visio, etc)
isSlacker:

gradYear:
Another Wireframe
                                                                                                                  Design




                                               (The View - Again)
                                                                                                           Test            Develop



                                                       Infraction View



               Search for Student Input                                Search

                                                                                Last Name
                                                                                First Name
                                                                                Graduating Year
                                                                                Course



Imagine the     Editor Controls                                             A    ab

new code for
                                     Format        Font         Size

                                     B     i   u   1
                                                   2


   this.
                                                   3



                      Textarea       enter text




                     Date Selector       __ / __ / ____

                                      Select a date range




                                                                                                  Submit
Design right back to Development
                                                                                              Design




                                 (The Fix! Do you see it?)
                                                                                     Test              Develop




         public function studentUpdate()
         	   {
         	   	    $mongo_id = new MongoID($_POST['_id']);	
         	   	
         	   	    $data = $this->cleanupData($_POST);
         	   	
         	   	    $this->col->update(array("_id" => $mongo_id), array('$push' => $data));
         	   	
         	   	    return;
         	   }




 $_POST['_id'] = '4b7c29908ead0e2e1d000000';
 $data = array('infractions'=> array('desc'=>'Caught Sharding', 'date'=> new MongoDate()));




Answer: The only thing that changed was the view in the last slide.
                     This code is the same!
Design and Development In Summary



Our Classes/Methods/Views made the schema
                  NoSQL
                  NoORM
          Arrays! Arrays! Arrays!
Design




                Let’s Test
                                      Test            Develop




What does MongoDB have to do with testing?
Design




                 Let’s Test
                                           Test            Develop




Isn’t it a good idea to run unit tests often?

    Where do you store the results?
Idea: PHPUnit to Mongo
                                                                                    Design




                                    (Test Logging)
                                                                             Test            Develop




                                                                          Test logs can
                                                                          go in Mongo




Clipping from: http://www.phpunit.de/manual/current/en/logging.html#logging.json
Wait, there is MORE!
Cursors
 MongoDates
                     Indexes                   MapReduce

                ...Just to name a few...
     Sharding
                                           Exceptions

MongoBinData
                                                MongoCode
            MongoRegex
No more time.


            Go here for more:
http://us.php.net/manual/en/book.mongo.php
         http://www.mongodb.org
    http://www.lightcubesolutions.com
{ “type”: “Conclusion”,
  “date”: new Date('04-30-2010'),
  “comments”: [“Thank You”,”Have Fun Developing”],
  “location”: “San Francisco”,
  “speaker”: “Fitz H. Agard”,
  “contact”: “fhagard@lightcube.us”
}

More Related Content

What's hot (17)

KEY
NOSQL101, Or: How I Learned To Stop Worrying And Love The Mongo!
Daniel Cousineau
 
PDF
jQuery%20on%20Rails%20Presentation
guestcf600a
 
KEY
Potential Friend Finder
Richard Schneeman
 
PDF
Banishing Loops with Functional Programming in PHP
David Hayes
 
PDF
Zend Framework 1 + Doctrine 2
Ralph Schindler
 
KEY
Django Pro ORM
Alex Gaynor
 
PDF
Recent Changes to jQuery's Internals
jeresig
 
PPTX
MongoDB + Java - Everything you need to know
Norberto Leite
 
PDF
Database madness with_mongoengine_and_sql_alchemy
Jaime Buelta
 
PDF
Dart
anandvns
 
PPTX
CodeIgniter Class Reference
Jamshid Hashimi
 
PPTX
Django - sql alchemy - jquery
Mohammed El Rafie Tarabay
 
PDF
Modern Application Foundations: Underscore and Twitter Bootstrap
Howard Lewis Ship
 
PDF
Transparent Object Persistence with FLOW3
Karsten Dambekalns
 
KEY
Advanced Django ORM techniques
Daniel Roseman
 
PDF
Therapeutic refactoring
kytrinyx
 
PDF
Spock and Geb
Christian Baranowski
 
NOSQL101, Or: How I Learned To Stop Worrying And Love The Mongo!
Daniel Cousineau
 
jQuery%20on%20Rails%20Presentation
guestcf600a
 
Potential Friend Finder
Richard Schneeman
 
Banishing Loops with Functional Programming in PHP
David Hayes
 
Zend Framework 1 + Doctrine 2
Ralph Schindler
 
Django Pro ORM
Alex Gaynor
 
Recent Changes to jQuery's Internals
jeresig
 
MongoDB + Java - Everything you need to know
Norberto Leite
 
Database madness with_mongoengine_and_sql_alchemy
Jaime Buelta
 
Dart
anandvns
 
CodeIgniter Class Reference
Jamshid Hashimi
 
Django - sql alchemy - jquery
Mohammed El Rafie Tarabay
 
Modern Application Foundations: Underscore and Twitter Bootstrap
Howard Lewis Ship
 
Transparent Object Persistence with FLOW3
Karsten Dambekalns
 
Advanced Django ORM techniques
Daniel Roseman
 
Therapeutic refactoring
kytrinyx
 
Spock and Geb
Christian Baranowski
 

Similar to PHP Development With MongoDB (20)

PDF
mongodb-introduction
Tse-Ching Ho
 
PDF
Drupal - dbtng 25th Anniversary Edition
ddiers
 
PDF
Full metal mongo
Israel Gutiérrez
 
PDF
Groovy On Trading Desk (2010)
Jonathan Felch
 
PDF
MongoDB a document store that won't let you down.
Nurul Ferdous
 
KEY
Mongo NYC PHP Development
Fitz Agard
 
KEY
[Coscup 2012] JavascriptMVC
Alive Kuo
 
KEY
Rails with mongodb
Kosuke Matsuda
 
ODP
This upload requires better support for ODP format
Forest Mars
 
PPTX
Drupal II: The SQL
ddiers
 
PPT
Mongo-Drupal
Forest Mars
 
KEY
Building Better Applications with Data::Manager
Jay Shirley
 
PDF
Real World Optimization
David Golden
 
PDF
Mongo Presentation by Metatagg Solutions
Metatagg Solutions
 
KEY
Object Relational Mapping in PHP
Rob Knight
 
PDF
Having Fun with Play
Clinton Dreisbach
 
PDF
Latinoware
kchodorow
 
PDF
gDayX - Advanced angularjs
gdgvietnam
 
ODP
DrupalCon Chicago Practical MongoDB and Drupal
Doug Green
 
KEY
What's new in Django 1.2?
Jacob Kaplan-Moss
 
mongodb-introduction
Tse-Ching Ho
 
Drupal - dbtng 25th Anniversary Edition
ddiers
 
Full metal mongo
Israel Gutiérrez
 
Groovy On Trading Desk (2010)
Jonathan Felch
 
MongoDB a document store that won't let you down.
Nurul Ferdous
 
Mongo NYC PHP Development
Fitz Agard
 
[Coscup 2012] JavascriptMVC
Alive Kuo
 
Rails with mongodb
Kosuke Matsuda
 
This upload requires better support for ODP format
Forest Mars
 
Drupal II: The SQL
ddiers
 
Mongo-Drupal
Forest Mars
 
Building Better Applications with Data::Manager
Jay Shirley
 
Real World Optimization
David Golden
 
Mongo Presentation by Metatagg Solutions
Metatagg Solutions
 
Object Relational Mapping in PHP
Rob Knight
 
Having Fun with Play
Clinton Dreisbach
 
Latinoware
kchodorow
 
gDayX - Advanced angularjs
gdgvietnam
 
DrupalCon Chicago Practical MongoDB and Drupal
Doug Green
 
What's new in Django 1.2?
Jacob Kaplan-Moss
 
Ad

Recently uploaded (20)

PDF
Kit-Works Team Study_20250627_한달만에만든사내서비스키링(양다윗).pdf
Wonjun Hwang
 
PDF
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PDF
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PDF
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
PDF
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PDF
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PDF
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PPT
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PPTX
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
PPTX
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
Kit-Works Team Study_20250627_한달만에만든사내서비스키링(양다윗).pdf
Wonjun Hwang
 
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
AI Agents in the Cloud: The Rise of Agentic Cloud Architecture
Lilly Gracia
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
Seamless Tech Experiences Showcasing Cross-Platform App Design.pptx
presentifyai
 
Ad

PHP Development With MongoDB

  • 1. MongoSF - PHP Development With MongoDB Presented By: Fitz Agard - LightCube Solutions LLC April 30, 2010
  • 2. Introductions - Who is this guy? { “name”: “Fitz Agard”, “description”: [“Developer”,”Consultant”,”Data Junkie”, “Educator”, “Engineer”], “location”: “New York”, “companies”:[ {“name”: “LightCube Solutions”, “url”: “www.lightcubesolutions.com”} ], “urls”:[ {“name”: “LinkedIn”, “url”: “http://www.linkedin.com/in/fitzagard”}, {“name”: “Twitter”, “url”: “http://www.twitter.com/fitzhagard”} ], “email”: “[email protected]” } (If the above formatting confused you please see - http://json.org/)
  • 3. Why PHP Developers Should Use MongoDB? PHP Reasons Database Reasons • Enhanced Development Cycle - Itʼs no longer • Document-oriented storage - JSON-style documents with dynamic necessary to go back and forth between the Database schemas offer simplicity and power. Schema and Object. • Full Index Support - Index on any attribute. • Easy Ramp-Up - Queries are just an array away. • Replication & High Availability - Mirror across LANs and WANs. • No Need For ORM - No Schema! • Auto-Sharding - Scale horizontally without compromising functionality. • DBA? What DBA? • Querying - Rich, document-based queries. • Arrays, Array, Arrays! • Fast In-Place Updates - Atomic modifiers for contention-free performance. • Map/Reduce - Flexible aggregation and data processing. • GridFS - Store files of any size.
  • 4. Mongo and PHP in a Nutshell http://us.php.net/manual/en/book.mongo.php Common Methods Conditional Operators • find() • $ne • findOne() • $in • save() • $nin • remove() • $mod • update() • $all • group() • $size • limit() • $exists • skip() • $type • ensureIndex() • $gt • count() • $lt • ...And More • $lte • $gte
  • 5. Mongo and PHP in a Nutshell (Connectivity) http://us2.php.net/manual/en/mongo.connecting.php function __construct() { global $dbname, $dbuser, $dbpass; $this->dbname = $dbname; $this->dbuser = $dbuser; $this->dbpass = $dbpass; // Make the initial connection try { $this->_link = new Mongo(); // Select the DB $this->db = $this->_link->selectDB($this->dbname); // Authenticate $result = $this->db->authenticate($this->dbuser, $this->dbpass); if ($result['ok'] == 0) { // Authentication failed. $this->error = ($result['errmsg'] == 'auth fails') ? 'Database Authentication Failure' : $result['errmsg']; $this->_connected = false; } else { $this->_connected = true; } } catch (Exception $e) { $this->error = (empty($this->error)) ? 'Database Connection Error' : $this->error; } }
  • 6. Mongo and PHP in a Nutshell (Simple Queries) http://us2.php.net/manual/en/mongo.queries.php /* * SELECT * FROM students * WHERE isSlacker = true * AND postalCode IN (10466,10407,10704) * AND gradYear BETWEEN (2010 AND 2014) * ORDER BY lastName DESC */ $collection = $this->db->students; $collection->ensureIndex(array('isSlacker'=>1, 'postalCode'=>1, 'lastName'=>1, 'gradYear'=>-1)); $conditions = array('postalCode'=>array('$in'=>array(10466,10407,10704)), 'isSlacker'=>true, 'gradYear'=>array('$gt'=>2010, '$lt'=>2014)); $results = $collection->find($conditions)->sort(array('lastName'=>1)); $collection = $this->db->grades; //SELECT count(*) FROM grades $total = $collection->count(); //SELECT count(*) FROM grades WHERE grade = 90 $smartyPants = $collection->find(array("grade"=>90))->count();
  • 7. Mongo and PHP in a Nutshell (Using GridFS) http://us2.php.net/manual/en/class.mongogridfs.php $m = new Mongo(); //select Mongo Database $db = $m->selectDB("studentsystem"); //use GridFS class for handling files $grid = $db->getGridFS(); //Optional - capture the name of the uploaded file $name = $_FILES['Filedata']['name']; //load file into MongoDB and get back _id $id = $grid->storeUpload('Filedata',$name); //set a mongodate $date = new MongoDate(); //Use $set to add metadata to a file $metaData = array('$set' => array("comment"=>"This looks like a MongoDB Student", "date"=>$date)); //Just setting up search criteria $criteria = array('_id' => $id); //Update the document with the new info $db->grid->update($criteria, $metaData);
  • 8. Mongo and PHP in a Nutshell (Using GridFS) public function remove($criteria) { //Get the GridFS Object $grid = $this->db->getGridFS(); //Setup some criteria to search for file $id = new MongoID($criteria['_id']); //Remove file $grid->remove(array('_id'=>$id), true); //Get lastError array $errorArray = $db->lastError(); if ($errorArray['ok'] == 1 ) { $retval = true; }else{ //Send back the error message $retval = $errorArray['err']; } return $retval; }
  • 9. Let’s develop a simple student information capture system with mongoDB and PHP!
  • 10. Typical Development Cycle Design Test Develop
  • 11. Typical Design Design (The Schema) Test Develop
  • 12. Our Design Design (The Mongo Model) Test Develop db.students db.teachers firstName: firstName: lastName: lastName: address: isCrazy: address: city: state: postalCode: db.courses grades: name: grade: isImpossible: course: teacher: createdDate: modifiedDate: comment: schedule: course: sysInfo: Whiteboards aren’t this neat but they are just as good! username: password: isSlacker: gradYear:
  • 13. Some Wireframes Design (The View) Test Develop Select Course: - Select One - * Required User Name: * Required Select Student: - Select One - * Required Password: ***************** * Required Grade: First Name: * Required Submit Last Name: * Required Address: * Required City, State, Postal Code: City - State - Postal Code * Required Click if this student is a slacker Imagine the code for this Graduation Date: mm/dd/yyyy Submit
  • 14. Design We’re Developing Test Develop public function studentUpdate() { $mongo_id = new MongoID($_POST['_id']); $data = $this->cleanupData($_POST); $this->col->update(array("_id" => $mongo_id), array('$push' => $data)); return; } $_POST = '4b7c29908ead0e2e1d000000'; $data = array('firstName'=>'Fitz', 'lastName'=>'Agard', 'address'=>array( 'address'=>'123 Data Lane', 'state'=>'New York', Letʼs assume cleanupData only removes 'postalCode'=>10704 unnecessary POST elements like the _id ), 'sysInfo'=>array( 'username'=>'fhagard', 'password'=>sha1('MongoW00t') ), 'isSlacker'=>true, 'gradYear'=>2003 );
  • 15. Design We’re Developing Test Develop public function studentUpdate() { $mongo_id = new MongoID($_POST['_id']); $data = $this->cleanupData($_POST); $this->col->update(array("_id" => $mongo_id), array('$push' => $data)); return; } $_POST = '4b7c29908ead0e2e1d000000'; $data = array('grades'=>array( 'grade'=>'3.8', 'course'=>'4bd0dd44cc93740f3e00251c', 'createDate'=>new MongoDate())); Donʼt forget that cleanupData only removes unnecessary POST elements like the _id
  • 16. Design Test Develop Problem: The client called and asked why we forgot to collect “student infractions” in our design. oops! “oops” - used typically to express mild apology, surprise, or dismay.
  • 17. Development back to Design Design (“oops” is easily fixed) Test Develop db.students firstName: lastName: address: address: city: state: postalCode: infractions: grades: desc: grade: date: course: createdDate: modifiedDate: comment: schedule: course: sysInfo: username: password: Back to the whiteboard (or - napkin, omnigraffle, visio, etc) isSlacker: gradYear:
  • 18. Another Wireframe Design (The View - Again) Test Develop Infraction View Search for Student Input Search Last Name First Name Graduating Year Course Imagine the Editor Controls A ab new code for Format Font Size B i u 1 2 this. 3 Textarea enter text Date Selector __ / __ / ____ Select a date range Submit
  • 19. Design right back to Development Design (The Fix! Do you see it?) Test Develop public function studentUpdate() { $mongo_id = new MongoID($_POST['_id']); $data = $this->cleanupData($_POST); $this->col->update(array("_id" => $mongo_id), array('$push' => $data)); return; } $_POST['_id'] = '4b7c29908ead0e2e1d000000'; $data = array('infractions'=> array('desc'=>'Caught Sharding', 'date'=> new MongoDate())); Answer: The only thing that changed was the view in the last slide. This code is the same!
  • 20. Design and Development In Summary Our Classes/Methods/Views made the schema NoSQL NoORM Arrays! Arrays! Arrays!
  • 21. Design Let’s Test Test Develop What does MongoDB have to do with testing?
  • 22. Design Let’s Test Test Develop Isn’t it a good idea to run unit tests often? Where do you store the results?
  • 23. Idea: PHPUnit to Mongo Design (Test Logging) Test Develop Test logs can go in Mongo Clipping from: http://www.phpunit.de/manual/current/en/logging.html#logging.json
  • 24. Wait, there is MORE!
  • 25. Cursors MongoDates Indexes MapReduce ...Just to name a few... Sharding Exceptions MongoBinData MongoCode MongoRegex
  • 26. No more time. Go here for more: http://us.php.net/manual/en/book.mongo.php http://www.mongodb.org http://www.lightcubesolutions.com
  • 27. { “type”: “Conclusion”, “date”: new Date('04-30-2010'), “comments”: [“Thank You”,”Have Fun Developing”], “location”: “San Francisco”, “speaker”: “Fitz H. Agard”, “contact”: “[email protected]” }