SlideShare une entreprise Scribd logo
1  sur  27
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”
}

Contenu connexe

Tendances

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
 

Tendances (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
 

Similaire à PHP Development With MongoDB

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
 

Similaire à PHP Development With MongoDB (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?
 

Dernier

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 

Dernier (20)

Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 

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”: “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” }

Notes de l'éditeur