SlideShare una empresa de Scribd logo
1 de 27
Descargar para leer sin conexión
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”
}

Más contenido relacionado

La actualidad más candente

NOSQL101, Or: How I Learned To Stop Worrying And Love The Mongo!
NOSQL101, Or: How I Learned To Stop Worrying And Love The Mongo!NOSQL101, Or: How I Learned To Stop Worrying And Love The Mongo!
NOSQL101, Or: How I Learned To Stop Worrying And Love The Mongo!Daniel Cousineau
 
jQuery%20on%20Rails%20Presentation
jQuery%20on%20Rails%20PresentationjQuery%20on%20Rails%20Presentation
jQuery%20on%20Rails%20Presentationguestcf600a
 
Banishing Loops with Functional Programming in PHP
Banishing Loops with Functional Programming in PHPBanishing Loops with Functional Programming in PHP
Banishing Loops with Functional Programming in PHPDavid Hayes
 
Zend Framework 1 + Doctrine 2
Zend Framework 1 + Doctrine 2Zend Framework 1 + Doctrine 2
Zend Framework 1 + Doctrine 2Ralph Schindler
 
Recent Changes to jQuery's Internals
Recent Changes to jQuery's InternalsRecent Changes to jQuery's Internals
Recent Changes to jQuery's Internalsjeresig
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know Norberto Leite
 
Database madness with_mongoengine_and_sql_alchemy
Database madness with_mongoengine_and_sql_alchemyDatabase madness with_mongoengine_and_sql_alchemy
Database madness with_mongoengine_and_sql_alchemyJaime Buelta
 
CodeIgniter Class Reference
CodeIgniter Class ReferenceCodeIgniter Class Reference
CodeIgniter Class ReferenceJamshid Hashimi
 
Modern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter BootstrapModern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter BootstrapHoward Lewis Ship
 
Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Karsten Dambekalns
 
Advanced Django ORM techniques
Advanced Django ORM techniquesAdvanced Django ORM techniques
Advanced Django ORM techniquesDaniel Roseman
 
Therapeutic refactoring
Therapeutic refactoringTherapeutic refactoring
Therapeutic refactoringkytrinyx
 

La actualidad más candente (17)

NOSQL101, Or: How I Learned To Stop Worrying And Love The Mongo!
NOSQL101, Or: How I Learned To Stop Worrying And Love The Mongo!NOSQL101, Or: How I Learned To Stop Worrying And Love The Mongo!
NOSQL101, Or: How I Learned To Stop Worrying And Love The Mongo!
 
jQuery%20on%20Rails%20Presentation
jQuery%20on%20Rails%20PresentationjQuery%20on%20Rails%20Presentation
jQuery%20on%20Rails%20Presentation
 
Potential Friend Finder
Potential Friend FinderPotential Friend Finder
Potential Friend Finder
 
Banishing Loops with Functional Programming in PHP
Banishing Loops with Functional Programming in PHPBanishing Loops with Functional Programming in PHP
Banishing Loops with Functional Programming in PHP
 
Zend Framework 1 + Doctrine 2
Zend Framework 1 + Doctrine 2Zend Framework 1 + Doctrine 2
Zend Framework 1 + Doctrine 2
 
Django Pro ORM
Django Pro ORMDjango Pro ORM
Django Pro ORM
 
Recent Changes to jQuery's Internals
Recent Changes to jQuery's InternalsRecent Changes to jQuery's Internals
Recent Changes to jQuery's Internals
 
MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know MongoDB + Java - Everything you need to know
MongoDB + Java - Everything you need to know
 
Database madness with_mongoengine_and_sql_alchemy
Database madness with_mongoengine_and_sql_alchemyDatabase madness with_mongoengine_and_sql_alchemy
Database madness with_mongoengine_and_sql_alchemy
 
Dart
DartDart
Dart
 
CodeIgniter Class Reference
CodeIgniter Class ReferenceCodeIgniter Class Reference
CodeIgniter Class Reference
 
Django - sql alchemy - jquery
Django - sql alchemy - jqueryDjango - sql alchemy - jquery
Django - sql alchemy - jquery
 
Modern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter BootstrapModern Application Foundations: Underscore and Twitter Bootstrap
Modern Application Foundations: Underscore and Twitter Bootstrap
 
Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3Transparent Object Persistence with FLOW3
Transparent Object Persistence with FLOW3
 
Advanced Django ORM techniques
Advanced Django ORM techniquesAdvanced Django ORM techniques
Advanced Django ORM techniques
 
Therapeutic refactoring
Therapeutic refactoringTherapeutic refactoring
Therapeutic refactoring
 
Spock and Geb
Spock and GebSpock and Geb
Spock and Geb
 

Similar a PHP Development with MongoDB (Fitz Agard)

mongodb-introduction
mongodb-introductionmongodb-introduction
mongodb-introductionTse-Ching Ho
 
Drupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary EditionDrupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary Editionddiers
 
Groovy On Trading Desk (2010)
Groovy On Trading Desk (2010)Groovy On Trading Desk (2010)
Groovy On Trading Desk (2010)Jonathan Felch
 
MongoDB a document store that won't let you down.
MongoDB a document store that won't let you down.MongoDB a document store that won't let you down.
MongoDB a document store that won't let you down.Nurul Ferdous
 
Mongo NYC PHP Development
Mongo NYC PHP Development Mongo NYC PHP Development
Mongo NYC PHP Development Fitz Agard
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVCAlive Kuo
 
This upload requires better support for ODP format
This upload requires better support for ODP formatThis upload requires better support for ODP format
This upload requires better support for ODP formatForest Mars
 
Drupal II: The SQL
Drupal II: The SQLDrupal II: The SQL
Drupal II: The SQLddiers
 
Building Better Applications with Data::Manager
Building Better Applications with Data::ManagerBuilding Better Applications with Data::Manager
Building Better Applications with Data::ManagerJay Shirley
 
Real World Optimization
Real World OptimizationReal World Optimization
Real World OptimizationDavid Golden
 
Mongo Presentation by Metatagg Solutions
Mongo Presentation by Metatagg SolutionsMongo Presentation by Metatagg Solutions
Mongo Presentation by Metatagg SolutionsMetatagg Solutions
 
Object Relational Mapping in PHP
Object Relational Mapping in PHPObject Relational Mapping in PHP
Object Relational Mapping in PHPRob Knight
 
gDayX - Advanced angularjs
gDayX - Advanced angularjsgDayX - Advanced angularjs
gDayX - Advanced angularjsgdgvietnam
 
DrupalCon Chicago Practical MongoDB and Drupal
DrupalCon Chicago Practical MongoDB and DrupalDrupalCon Chicago Practical MongoDB and Drupal
DrupalCon Chicago Practical MongoDB and DrupalDoug Green
 

Similar a PHP Development with MongoDB (Fitz Agard) (20)

mongodb-introduction
mongodb-introductionmongodb-introduction
mongodb-introduction
 
Drupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary EditionDrupal - dbtng 25th Anniversary Edition
Drupal - dbtng 25th Anniversary Edition
 
Full metal mongo
Full metal mongoFull metal mongo
Full metal mongo
 
Groovy On Trading Desk (2010)
Groovy On Trading Desk (2010)Groovy On Trading Desk (2010)
Groovy On Trading Desk (2010)
 
MongoDB a document store that won't let you down.
MongoDB a document store that won't let you down.MongoDB a document store that won't let you down.
MongoDB a document store that won't let you down.
 
Mongo NYC PHP Development
Mongo NYC PHP Development Mongo NYC PHP Development
Mongo NYC PHP Development
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 
Rails with mongodb
Rails with mongodbRails with mongodb
Rails with mongodb
 
This upload requires better support for ODP format
This upload requires better support for ODP formatThis upload requires better support for ODP format
This upload requires better support for ODP format
 
Drupal II: The SQL
Drupal II: The SQLDrupal II: The SQL
Drupal II: The SQL
 
Mongo-Drupal
Mongo-DrupalMongo-Drupal
Mongo-Drupal
 
Building Better Applications with Data::Manager
Building Better Applications with Data::ManagerBuilding Better Applications with Data::Manager
Building Better Applications with Data::Manager
 
Real World Optimization
Real World OptimizationReal World Optimization
Real World Optimization
 
Mongo Presentation by Metatagg Solutions
Mongo Presentation by Metatagg SolutionsMongo Presentation by Metatagg Solutions
Mongo Presentation by Metatagg Solutions
 
Object Relational Mapping in PHP
Object Relational Mapping in PHPObject Relational Mapping in PHP
Object Relational Mapping in PHP
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
Latinoware
LatinowareLatinoware
Latinoware
 
gDayX - Advanced angularjs
gDayX - Advanced angularjsgDayX - Advanced angularjs
gDayX - Advanced angularjs
 
DrupalCon Chicago Practical MongoDB and Drupal
DrupalCon Chicago Practical MongoDB and DrupalDrupalCon Chicago Practical MongoDB and Drupal
DrupalCon Chicago Practical MongoDB and Drupal
 
What's new in Django 1.2?
What's new in Django 1.2?What's new in Django 1.2?
What's new in Django 1.2?
 

Más de MongoSF

Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) MongoSF
 
Schema design with MongoDB (Dwight Merriman)
Schema design with MongoDB (Dwight Merriman)Schema design with MongoDB (Dwight Merriman)
Schema design with MongoDB (Dwight Merriman)MongoSF
 
C# Development (Sam Corder)
C# Development (Sam Corder)C# Development (Sam Corder)
C# Development (Sam Corder)MongoSF
 
Flexible Event Tracking (Paul Gebheim)
Flexible Event Tracking (Paul Gebheim)Flexible Event Tracking (Paul Gebheim)
Flexible Event Tracking (Paul Gebheim)MongoSF
 
Administration (Eliot Horowitz)
Administration (Eliot Horowitz)Administration (Eliot Horowitz)
Administration (Eliot Horowitz)MongoSF
 
Ruby Development and MongoMapper (John Nunemaker)
Ruby Development and MongoMapper (John Nunemaker)Ruby Development and MongoMapper (John Nunemaker)
Ruby Development and MongoMapper (John Nunemaker)MongoSF
 
MongoHQ (Jason McCay & Ben Wyrosdick)
MongoHQ (Jason McCay & Ben Wyrosdick)MongoHQ (Jason McCay & Ben Wyrosdick)
MongoHQ (Jason McCay & Ben Wyrosdick)MongoSF
 
Administration
AdministrationAdministration
AdministrationMongoSF
 
Sharding with MongoDB (Eliot Horowitz)
Sharding with MongoDB (Eliot Horowitz)Sharding with MongoDB (Eliot Horowitz)
Sharding with MongoDB (Eliot Horowitz)MongoSF
 
Practical Ruby Projects (Alex Sharp)
Practical Ruby Projects (Alex Sharp)Practical Ruby Projects (Alex Sharp)
Practical Ruby Projects (Alex Sharp)MongoSF
 
Implementing MongoDB at Shutterfly (Kenny Gorman)
Implementing MongoDB at Shutterfly (Kenny Gorman)Implementing MongoDB at Shutterfly (Kenny Gorman)
Implementing MongoDB at Shutterfly (Kenny Gorman)MongoSF
 
Debugging Ruby (Aman Gupta)
Debugging Ruby (Aman Gupta)Debugging Ruby (Aman Gupta)
Debugging Ruby (Aman Gupta)MongoSF
 
Indexing and Query Optimizer (Aaron Staple)
Indexing and Query Optimizer (Aaron Staple)Indexing and Query Optimizer (Aaron Staple)
Indexing and Query Optimizer (Aaron Staple)MongoSF
 
MongoDB Replication (Dwight Merriman)
MongoDB Replication (Dwight Merriman)MongoDB Replication (Dwight Merriman)
MongoDB Replication (Dwight Merriman)MongoSF
 
Zero to Mongo in 60 Hours
Zero to Mongo in 60 HoursZero to Mongo in 60 Hours
Zero to Mongo in 60 HoursMongoSF
 
Building a Mongo DSL in Scala at Hot Potato (Lincoln Hochberg)
Building a Mongo DSL in Scala at Hot Potato (Lincoln Hochberg)Building a Mongo DSL in Scala at Hot Potato (Lincoln Hochberg)
Building a Mongo DSL in Scala at Hot Potato (Lincoln Hochberg)MongoSF
 
Java Development with MongoDB (James Williams)
Java Development with MongoDB (James Williams)Java Development with MongoDB (James Williams)
Java Development with MongoDB (James Williams)MongoSF
 
Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & M...
Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & M...Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & M...
Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & M...MongoSF
 
From MySQL to MongoDB at Wordnik (Tony Tam)
From MySQL to MongoDB at Wordnik (Tony Tam)From MySQL to MongoDB at Wordnik (Tony Tam)
From MySQL to MongoDB at Wordnik (Tony Tam)MongoSF
 
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)MongoSF
 

Más de MongoSF (20)

Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
Webinar: Typische MongoDB Anwendungsfälle (Common MongoDB Use Cases) 
 
Schema design with MongoDB (Dwight Merriman)
Schema design with MongoDB (Dwight Merriman)Schema design with MongoDB (Dwight Merriman)
Schema design with MongoDB (Dwight Merriman)
 
C# Development (Sam Corder)
C# Development (Sam Corder)C# Development (Sam Corder)
C# Development (Sam Corder)
 
Flexible Event Tracking (Paul Gebheim)
Flexible Event Tracking (Paul Gebheim)Flexible Event Tracking (Paul Gebheim)
Flexible Event Tracking (Paul Gebheim)
 
Administration (Eliot Horowitz)
Administration (Eliot Horowitz)Administration (Eliot Horowitz)
Administration (Eliot Horowitz)
 
Ruby Development and MongoMapper (John Nunemaker)
Ruby Development and MongoMapper (John Nunemaker)Ruby Development and MongoMapper (John Nunemaker)
Ruby Development and MongoMapper (John Nunemaker)
 
MongoHQ (Jason McCay & Ben Wyrosdick)
MongoHQ (Jason McCay & Ben Wyrosdick)MongoHQ (Jason McCay & Ben Wyrosdick)
MongoHQ (Jason McCay & Ben Wyrosdick)
 
Administration
AdministrationAdministration
Administration
 
Sharding with MongoDB (Eliot Horowitz)
Sharding with MongoDB (Eliot Horowitz)Sharding with MongoDB (Eliot Horowitz)
Sharding with MongoDB (Eliot Horowitz)
 
Practical Ruby Projects (Alex Sharp)
Practical Ruby Projects (Alex Sharp)Practical Ruby Projects (Alex Sharp)
Practical Ruby Projects (Alex Sharp)
 
Implementing MongoDB at Shutterfly (Kenny Gorman)
Implementing MongoDB at Shutterfly (Kenny Gorman)Implementing MongoDB at Shutterfly (Kenny Gorman)
Implementing MongoDB at Shutterfly (Kenny Gorman)
 
Debugging Ruby (Aman Gupta)
Debugging Ruby (Aman Gupta)Debugging Ruby (Aman Gupta)
Debugging Ruby (Aman Gupta)
 
Indexing and Query Optimizer (Aaron Staple)
Indexing and Query Optimizer (Aaron Staple)Indexing and Query Optimizer (Aaron Staple)
Indexing and Query Optimizer (Aaron Staple)
 
MongoDB Replication (Dwight Merriman)
MongoDB Replication (Dwight Merriman)MongoDB Replication (Dwight Merriman)
MongoDB Replication (Dwight Merriman)
 
Zero to Mongo in 60 Hours
Zero to Mongo in 60 HoursZero to Mongo in 60 Hours
Zero to Mongo in 60 Hours
 
Building a Mongo DSL in Scala at Hot Potato (Lincoln Hochberg)
Building a Mongo DSL in Scala at Hot Potato (Lincoln Hochberg)Building a Mongo DSL in Scala at Hot Potato (Lincoln Hochberg)
Building a Mongo DSL in Scala at Hot Potato (Lincoln Hochberg)
 
Java Development with MongoDB (James Williams)
Java Development with MongoDB (James Williams)Java Development with MongoDB (James Williams)
Java Development with MongoDB (James Williams)
 
Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & M...
Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & M...Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & M...
Real time ecommerce analytics with MongoDB at Gilt Groupe (Michael Bryzek & M...
 
From MySQL to MongoDB at Wordnik (Tony Tam)
From MySQL to MongoDB at Wordnik (Tony Tam)From MySQL to MongoDB at Wordnik (Tony Tam)
From MySQL to MongoDB at Wordnik (Tony Tam)
 
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
Map/reduce, geospatial indexing, and other cool features (Kristina Chodorow)
 

Último

UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfDianaGray10
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IES VE
 
OpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureOpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureEric D. Schabell
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationIES VE
 
Introduction to Quantum Computing
Introduction to Quantum ComputingIntroduction to Quantum Computing
Introduction to Quantum ComputingGDSC PJATK
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesDavid Newbury
 
Cloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial DataCloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial DataSafe Software
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfAijun Zhang
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Websitedgelyza
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaborationbruanjhuli
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024D Cloud Solutions
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemAsko Soukka
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintMahmoud Rabie
 
RAG Patterns and Vector Search in Generative AI
RAG Patterns and Vector Search in Generative AIRAG Patterns and Vector Search in Generative AI
RAG Patterns and Vector Search in Generative AIUdaiappa Ramachandran
 
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfDaniel Santiago Silva Capera
 
Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.francesco barbera
 

Último (20)

UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdfUiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
UiPath Solutions Management Preview - Northern CA Chapter - March 22.pdf
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
 
OpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability AdventureOpenShift Commons Paris - Choose Your Own Observability Adventure
OpenShift Commons Paris - Choose Your Own Observability Adventure
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
 
Introduction to Quantum Computing
Introduction to Quantum ComputingIntroduction to Quantum Computing
Introduction to Quantum Computing
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond Ontologies
 
Cloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial DataCloud Revolution: Exploring the New Wave of Serverless Spatial Data
Cloud Revolution: Exploring the New Wave of Serverless Spatial Data
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdf
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024
 
Bird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystemBird eye's view on Camunda open source ecosystem
Bird eye's view on Camunda open source ecosystem
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 
Empowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership BlueprintEmpowering Africa's Next Generation: The AI Leadership Blueprint
Empowering Africa's Next Generation: The AI Leadership Blueprint
 
RAG Patterns and Vector Search in Generative AI
RAG Patterns and Vector Search in Generative AIRAG Patterns and Vector Search in Generative AI
RAG Patterns and Vector Search in Generative AI
 
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdfIaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
IaC & GitOps in a Nutshell - a FridayInANuthshell Episode.pdf
 
Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.Digital magic. A small project for controlling smart light bulbs.
Digital magic. A small project for controlling smart light bulbs.
 

PHP Development with MongoDB (Fitz Agard)

  • 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”: “fhagard@lightcube.us” } (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”: “fhagard@lightcube.us” }

Notas del editor