Doctrine
               MongoDB Object Document Mapper (ODM)




Doctrine MongoDB ODM   www.doctrine-project.org   www.sen...
What is Doctrine?



Doctrine MongoDB ODM   www.doctrine-project.org   www.sensiolabs.org
What is Doctrine?
  •    Open source PHP project started in 2006

  •    Relational database abstraction layer.
        • ...
What is MongoDB?
  •    Key-Value document based storage
       system.

  •    Bridge between traditional relational
    ...
Terminology

                       RDBMS                                MongoDB
                       Database          ...
Using MongoDB in PHP



Doctrine MongoDB ODM   www.doctrine-project.org   www.sensiolabs.org
Connecting


       $mongo = new Mongo('mongodb://localhost');




Doctrine MongoDB ODM   www.doctrine-project.org   www.s...
Selecting Databases


       $mongo = new Mongo('mongodb://localhost');
       $db = $mongo->selectDB('dbname');




Doctr...
Selecting Collections


       $mongo = new Mongo('mongodb://localhost');
       $db = $mongo->selectDB('dbname');
       ...
Inserting Documents
                 Insert a new user document and echo the newly generated id


       $user = array(
  ...
Updating Documents
                Update username and password and save the whole document




       $user = $coll->find...
Atomic Updates
  •    Faster than saving the entire document.

  •    Safer than updating the entire document.

  •    Upd...
Atomic Updates
                   Update username and password where username is jwage



       $coll->update(array(
    ...
Atomic Updates
            Many other atomic operators exist for manipulating a documents data




  •    $inc - increment...
Removing Documents


       $coll->remove(array('username' => 'jwage'));




Doctrine MongoDB ODM   www.doctrine-project.o...
Doctrine + MongoDB



Doctrine MongoDB ODM   www.doctrine-project.org   www.sensiolabs.org
DocumentManager
  •    Abstraction on top of the PHP Mongo
       class

  •    Manages the persistent state of PHP
      ...
Document States
  •    A NEW document instance has no persistent identity, and is not yet
       associated with a Documen...
DocumentManager
           Create your DocumentManager instance for managing object persistence



       $config = new Do...
Defining Document
                       A document is just a regular ole’ PHP class

                                class...
Mapping the Document

                              /** @Document */
                              class User
            ...
Ready to Go
        Doctrine now knows about this document and is able
                   to manage its persistent state

...
Inserting, Updating and
          Deleting Documents


Doctrine MongoDB ODM   www.doctrine-project.org   www.sensiolabs.org
Inserting Documents
                   $user = new User();
                   $user->setUsername('jwage');
               ...
Updating Documents
   $user = $dm->findOne('User', array('username' => 'jwage'));

   $user->setUsername('jonwage');
   $u...
Removing Documents

   $user = $dm->findOne('User', array('username' => 'jwage'));

   $dm->remove($user);
   $dm->flush()...
Query API
                            Fluent OO Query API




Doctrine MongoDB ODM   www.doctrine-project.org   www.sensio...
Querying MongoDB
                  Directly

   // Get user array directly from mongo
   $user = $mongo->db->users->findOn...
Querying Through
                    Doctrine

   // Get user class instance through Doctrine
   $user = $dm->findOne('Use...
Querying Through
             Doctrine Query API

   // Get user class instance through Doctrine Query API
   $user = $dm-...
Querying Through
             Doctrine Query API

              // Find posts within a range of dates
              $posts...
Updating Documents

              // Update a document
              $dm->createQuery('User')
                  ->update()...
Removing Documents

               // Remove a document
               $dm->createQuery('User')
                          ...
Embedded Documents



Doctrine MongoDB ODM   www.doctrine-project.org   www.sensiolabs.org
class User
                 {
                     /** @Id */
                     public $id;

                       /**...
/** @EmbeddedDocument */
                            class Address
                            {
                         ...
$user = new User();
             $user->name = 'Jonathan H. Wage';

             $address = new Address();
             $a...
$users = array(
                 array(
                     'name' => 'Jonathan H. Wage',
                     'addresses...
Updating Embedded
                Documents
         Uses dot notation and atomic operators for updating




Doctrine Mong...
$user = $dm->findOne('User', array('name' => 'Jonathan H. Wage'));
             $user->addresses[0]->zipcode = '37205';
  ...
Add New Address



Doctrine MongoDB ODM   www.doctrine-project.org   www.sensiolabs.org
$user = $dm->findOne('User', array('name' => 'Jonathan H. Wage'));

       $address = new Address();
       $address->addr...
unset($user->addresses[0]->zipcode);
       $dm->flush();



                       $coll->update(
                       ...
References
        MongoDB does not have joins or foreign keys but you
         can still store references to other docume...
Organization
                       /** @Document */
                       class Organization
                       {
  ...
User
                   /** @Document */
                   class User
                   {
                       /** @Id...
$organization = new Organization();
                 $organization->setName('Sensio Labs');

                 $user = new ...
The Result



Doctrine MongoDB ODM   www.doctrine-project.org   www.sensiolabs.org
Array
                   (
                       [_id] => 4c86acd78ead0e8759000000
                       [name] => Sensi...
Working with
                        References



Doctrine MongoDB ODM    www.doctrine-project.org   www.sensiolabs.org
$user = $dm->find('User', array('name' => 'Jonathan H. Wage'));

           // instance of uninitialized OrganizationProxy...
$organization = $dm->find('Organization', array('name' => 'Sensio Labs'));
     $users = $organization->getUsers(); // uni...
Change Tracking



Doctrine MongoDB ODM     www.doctrine-project.org   www.sensiolabs.org
UnitOfWork
  •    Tracks changes in objects between flushes

  •    Maintains copy of old values to compare
       new valu...
Other Features



Doctrine MongoDB ODM    www.doctrine-project.org   www.sensiolabs.org
Document Query
                    Language
         Language for querying documents in a similar way to
                 ...
BNF Grammar



Doctrine MongoDB ODM    www.doctrine-project.org   www.sensiolabs.org
QueryLanguage ::= FindQuery | InsertQuery | UpdateQuery | RemoveQuery

               FindQuery ::= FindClause [WhereClaus...
Creating Query


                $users = $dm->query('find all FROM User');




Doctrine MongoDB ODM    www.doctrine-proje...
Selecting Fields


            $users = $dm->query('find username FROM User');




Doctrine MongoDB ODM     www.doctrine-p...
Paging Results


       $users = $dm->query('find all FROM User limit 30 skip 30');




Doctrine MongoDB ODM    www.doctri...
Selecting Slice of
         Embedded Documents

  $post = $dm->query('find title, comments limit 20 skip 10 FROM
  BlogPos...
Other Examples
// Find all posts greater than or equal to a date
$posts = $dm->query('find all FROM BlogPost WHERE created...
Lifecycle Events



Doctrine MongoDB ODM     www.doctrine-project.org   www.sensiolabs.org
“A lifecycle event is a regular event with the additional
    feature of providing a mechanism to register direct
   callb...
•    preRemove - The preRemove event occurs for a given document before the
     respective DocumentManager remove operati...
Event Examples



Doctrine MongoDB ODM    www.doctrine-project.org   www.sensiolabs.org
/**
                         * @Document
                         * @HasLifecycleCallbacks
                         */
   ...
Migrating Data



Doctrine MongoDB ODM    www.doctrine-project.org   www.sensiolabs.org
Initial Document
                       /**
                         * @Document
                         */
             ...
New Document
                        /**
                          * @Document
                          */
              ...
Migrate Documents
          With Old Field Name
                       /**
                         * @Document
          ...
Questions?
                         Jonathan H. Wage
                  •    http://www.twitter.com/jwage

                ...
Upcoming SlideShare
Loading in...5
×

Doctrine MongoDB Object Document Mapper

29,974

Published on

Introduction to the PHP Doctrine MongoDB Object Document Mapper

Published in: Technology
0 Comments
30 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
29,974
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
279
Comments
0
Likes
30
Embeds 0
No embeds

No notes for slide

Transcript of "Doctrine MongoDB Object Document Mapper"

  1. 1. Doctrine MongoDB Object Document Mapper (ODM) Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  2. 2. What is Doctrine? Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  3. 3. What is Doctrine? • Open source PHP project started in 2006 • Relational database abstraction layer. • mysql, oracle, pgsql, sqlite, etc. • Object persistence layers for RDBMS, MongoDB, etc. • Other database related functionalities. http://www.doctrine-project.org Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  4. 4. What is MongoDB? • Key-Value document based storage system. • Bridge between traditional relational databases and key-value data stores. http://www.mongodb.org Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  5. 5. Terminology RDBMS MongoDB Database Database Table Collection Row Document Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  6. 6. Using MongoDB in PHP Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  7. 7. Connecting $mongo = new Mongo('mongodb://localhost'); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  8. 8. Selecting Databases $mongo = new Mongo('mongodb://localhost'); $db = $mongo->selectDB('dbname'); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  9. 9. Selecting Collections $mongo = new Mongo('mongodb://localhost'); $db = $mongo->selectDB('dbname'); $coll = $db->selectCollection('users'); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  10. 10. Inserting Documents Insert a new user document and echo the newly generated id $user = array( 'username' => 'jwage', 'password' => md5('changeme') 'active' => true ); $coll->insert($user); echo $user['_id']; Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  11. 11. Updating Documents Update username and password and save the whole document $user = $coll->findOne(array('username' => 'jwage')); $user['username'] = 'jonwage'; $user['password'] = md5('newpassword'); $coll->save($user); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  12. 12. Atomic Updates • Faster than saving the entire document. • Safer than updating the entire document. • Updates are done in place and are atomic. Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  13. 13. Atomic Updates Update username and password where username is jwage $coll->update(array( 'username' => 'jwage' ), array( '$set' => array( 'username' => 'jonwage', 'password' => md5('newpassword') ) )); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  14. 14. Atomic Updates Many other atomic operators exist for manipulating a documents data • $inc - increments field by the number value • $set - sets field to value • $unset - deletes a given field • $push - appends value to an array • $pushAll - appends multiple values to an array • $addToSet - appends multiple values to an array that don’t already exist in the array • $pop - removes the last element in an array • $pull - removes all occurrences of a value from an array • $pullAll - removes all occurrences of multiple values from an array Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  15. 15. Removing Documents $coll->remove(array('username' => 'jwage')); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  16. 16. Doctrine + MongoDB Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  17. 17. DocumentManager • Abstraction on top of the PHP Mongo class • Manages the persistent state of PHP objects • Implements UnitOfWork for change tracking http://martinfowler.com/eaaCatalog/unitOfWork.html Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  18. 18. Document States • A NEW document instance has no persistent identity, and is not yet associated with a DocumentManager (i.e. those just created with the "new" operator). • A MANAGED document instance is an instance with a persistent identity that is associated with an DocumentManager and whose persistence is thus managed. • A DETACHED document instance is an instance with a persistent identity that is not (or no longer) associated with an DocumentManager. • A REMOVED document instance is an instance with a persistent identity, associated with an DocumentManager, that will be removed from the database upon transaction commit. Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  19. 19. DocumentManager Create your DocumentManager instance for managing object persistence $config = new DoctrineODMMongoDBConfiguration(); $config->setMetadataCacheImpl(new DoctrineCommonCacheArrayCache); $driverImpl = $config->newDefaultAnnotationDriver(array(__DIR__."/Documents")); $config->setMetadataDriverImpl($driverImpl); $config->setProxyDir(__DIR__ . '/Proxies'); $config->setProxyNamespace('Proxies'); $dm = DoctrineORMDocumentManager::create($mongo, $config); Wraps around existing $mongo connection Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  20. 20. Defining Document A document is just a regular ole’ PHP class class User { private $id; private $username; private $password; public function getId() { return $this->id; } public function getUsername() { return $this->username; } public function setUsername($username) { $this->username = $username; } public function getPassword() { return $this->password; } public function setPassword($password) { $this->password = md5($password); } } Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  21. 21. Mapping the Document /** @Document */ class User { /** @Id */ private $id; /** @String */ private $username; /** @String */ private $password; // ... } Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  22. 22. Ready to Go Doctrine now knows about this document and is able to manage its persistent state Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  23. 23. Inserting, Updating and Deleting Documents Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  24. 24. Inserting Documents $user = new User(); $user->setUsername('jwage'); $user->setPassword('changeme'); $dm->persist($user); $dm->flush(); // inserts document $users = array( array( 'username' => 'jwage', 'password' => 'changeme' ) ); $coll->batchInsert($users); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  25. 25. Updating Documents $user = $dm->findOne('User', array('username' => 'jwage')); $user->setUsername('jonwage'); $user->setPassword('newpassword'); $dm->flush(); // updates document $coll->update( array('_id' => 'theid'), array('$set' => array( 'username' => 'jonwage', 'password' => '5e9d11a14ad1c8dd77e98ef9b53fd1ba' ) ); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  26. 26. Removing Documents $user = $dm->findOne('User', array('username' => 'jwage')); $dm->remove($user); $dm->flush(); // removes document $coll->remove(array('_id' => 'theid')); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  27. 27. Query API Fluent OO Query API Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  28. 28. Querying MongoDB Directly // Get user array directly from mongo $user = $mongo->db->users->findOne(array('username' => 'jwage')); Returns an array of information and not a User object Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  29. 29. Querying Through Doctrine // Get user class instance through Doctrine $user = $dm->findOne('User', array('username' => 'jwage')); Going through Doctrine gives you managed objects back instead of arrays Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  30. 30. Querying Through Doctrine Query API // Get user class instance through Doctrine Query API $user = $dm->createQuery('User') ->field('username')->equals('jwage') ->getSingleResult(); Query for same user using the Query API Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  31. 31. Querying Through Doctrine Query API // Find posts within a range of dates $posts = $dm->createQuery('Post') ->field('createdAt')->range($startDate, $endDate) ->execute(); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  32. 32. Updating Documents // Update a document $dm->createQuery('User') ->update() ->field('username')->set('jonwage') ->field('password')->set('newpassword') ->field('username')->equals('jwage') ->execute(); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  33. 33. Removing Documents // Remove a document $dm->createQuery('User') // Remove a document $dm->createQuery('User') ->remove() ->remove() ->field('username')->equals('jwage') ->execute(); ->field('username')->equals('jwage') ->execute(); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  34. 34. Embedded Documents Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  35. 35. class User { /** @Id */ public $id; /** @String */ public $name; /** @EmbedMany(targetDocument="Address") */ public $addresses = array(); } Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  36. 36. /** @EmbeddedDocument */ class Address { /** @String */ public $address; /** @String */ public $city; /** @String */ public $state; /** @String */ public $zipcode; } Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  37. 37. $user = new User(); $user->name = 'Jonathan H. Wage'; $address = new Address(); $address->address = '6512 Mercomatic Ct'; $address->city = 'Nashville'; $address->state = 'Tennessee'; $address->zipcode = '37209'; $user->addresses[] = $address; $dm->persist($user); $dm->flush(); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  38. 38. $users = array( array( 'name' => 'Jonathan H. Wage', 'addresses' => array( array( 'address' => '6512 Mercomatic Ct', 'city' => 'Nashville', 'state' => 'Tennesseee', 'zipcode' => '37209' ) ) ) ); $coll->batchInsert($users); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  39. 39. Updating Embedded Documents Uses dot notation and atomic operators for updating Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  40. 40. $user = $dm->findOne('User', array('name' => 'Jonathan H. Wage')); $user->addresses[0]->zipcode = '37205'; $dm->flush(); $coll->update( array('_id' => 'theuserid'), array('$set' => array('addresses.0.zipcode' => '37209')) ); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  41. 41. Add New Address Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  42. 42. $user = $dm->findOne('User', array('name' => 'Jonathan H. Wage')); $address = new Address(); $address->address = '475 Buckhead Ave.'; $address->city = 'Atlanta'; $address->state = 'Georgia'; $address->zipcode = '30305'; $user->addresses[] = $address; $dm->flush(); $coll->update( array('_id' => 'theuserid'), array('$pushAll' => array( 'addresses' => array( array( 'address' => '475 Buckhead Ave.', 'city' => 'Atlanta', 'state' => 'Georgia', 'zipcode' => '30305' ) ) )) ); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  43. 43. unset($user->addresses[0]->zipcode); $dm->flush(); $coll->update( array('_id' => 'theuserid'), array( '$unset' => array( 'addresses.0.zipcode' => 1 ) ) ); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  44. 44. References MongoDB does not have joins or foreign keys but you can still store references to other documents and resolve the references in your application code. Doctrine abstracts the handling of referneces for you so working with them is seamless. Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  45. 45. Organization /** @Document */ class Organization { /** @Id */ private $id; /** @String */ private $name; /** @ReferenceMany(targetDocument="User") */ private $users = array(); public function setName($name) { $this->name = $name; } public function addUser(User $user) { $this->users[] = $user; } } Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  46. 46. User /** @Document */ class User { /** @Id */ private $id; /** @String */ private $name; /** @ReferenceOne(targetDocument="Organization") */ private $organization; public function setName($name) { $this->name = $name; } public function setOrganization(Organization $organization) { $this->organization = $organization; $organization->addUser($this); } } Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  47. 47. $organization = new Organization(); $organization->setName('Sensio Labs'); $user = new User(); $user->setName('Jonathan H. Wage'); $user->setOrganization($organization); $dm->persist($organization); $dm->persist($user); $dm->flush(); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  48. 48. The Result Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  49. 49. Array ( [_id] => 4c86acd78ead0e8759000000 [name] => Sensio Labs [users] => Array ( [0] => Array ( [$ref] => User [$id] => 4c86acd78ead0e8759010000 [$db] => doctrine_odm_sandbox ) ) ) Array ( [_id] => 4c86acd78ead0e8759010000 [name] => Jonathan H. Wage [organization] => Array ( [$ref] => Organization [$id] => 4c86acd78ead0e8759000000 [$db] => doctrine_odm_sandbox ) ) Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  50. 50. Working with References Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  51. 51. $user = $dm->find('User', array('name' => 'Jonathan H. Wage')); // instance of uninitialized OrganizationProxy $organization = $user->getOrganization(); // calling getter or setter for uninitialized proxy // queries the database and initialized the proxy document // query invoked, organization data loaded and doc initialized echo $organization->getName(); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  52. 52. $organization = $dm->find('Organization', array('name' => 'Sensio Labs')); $users = $organization->getUsers(); // uninitialized collection // Queries database for users and initializes collection foreach ($users as $user) { // ... } Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  53. 53. Change Tracking Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  54. 54. UnitOfWork • Tracks changes in objects between flushes • Maintains copy of old values to compare new values to • Changesets computed and persisted in the most efficient way using atomic operators $inc, $set, $unset, $pullAll, $pushAll, etc. Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  55. 55. Other Features Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  56. 56. Document Query Language Language for querying documents in a similar way to SQL Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  57. 57. BNF Grammar Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  58. 58. QueryLanguage ::= FindQuery | InsertQuery | UpdateQuery | RemoveQuery FindQuery ::= FindClause [WhereClause] [MapClause] [ReduceClause] [SortClause] [LimitClause] [SkipClause] FindClause ::= "FIND" all | SelectField {"," SelectField} SelectField ::= DocumentFieldName SortClause ::= SortClauseField {"," SortClauseField} SortClauseField ::= DocumentFieldName "ASC | DESC" LimitClause ::= "LIMIT" LimitInteger SkipClause ::= "SKIP" SkipInteger MapClause ::= "MAP" MapFunction ReduceClause ::= "REDUCE" ReduceFunction DocumentFieldName ::= DocumentFieldName | EmbeddedDocument "." {"." DocumentFieldName} WhereClause ::= "WHERE" WhereClausePart {"AND" WhereClausePart} WhereClausePart ::= ["all", "not"] DocumentFieldName WhereClauseExpression Value WhereClauseExpression ::= "=" | "!=" | ">=" | "<=" | ">" | "<" | "in" "notIn" | "all" | "size" | "exists" | "type" Value ::= LiteralValue | JsonObject | JsonArray UpdateQuery ::= UpdateClause [WhereClause] UpdateClause ::= [SetExpression], [UnsetExpression], [IncrementExpression], [PushExpression], [PushAllExpression], [PullExpression], [PullAllExpression], [AddToSetExpression], [AddManyToSetExpression], [PopFirstExpression], [PopLastExpression] SetExpression ::= "SET" DocumentFieldName "=" Value {"," SetExpression} UnsetExpression ::= "UNSET" DocumentFieldName {"," UnsetExpression} IncrementExpression ::= "INC" DocumentFieldName "=" IncrementInteger {"," IncrementExpression} PushExpression ::= "PUSH" DocumentFieldName Value {"," PushExpression} PushAllExpression ::= "PUSHALL" DocumentFieldName Value {"," PushAllExpression} PullExpression ::= "PULL" DocumentFieldName Value {"," PullExpression} PullAllExpression ::= "PULLALL" DocumentFieldName Value {"," PullAllExpression} AddToSetExpression ::= "ADDTOSET" DocumentFieldName Value {"," AddToSetExpression} AddManyToSetExpression ::= "ADDMANYTOSET" DocumentFieldName Value {"," AddManyToSetExpression} PopFirstExpression ::= "POPFIRST" DocumentFieldName {"," PopFirstExpression} PopLastExpression ::= "POPLAST" DocumentFieldName {"," PopLastExpression} InsertQuery ::= InsertClause InsertSetClause {"," InsertSetClause} InsertSetClause ::= DocumentFieldName "=" Value RemoveQuery ::= RemoveClause [WhereClause] Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  59. 59. Creating Query $users = $dm->query('find all FROM User'); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  60. 60. Selecting Fields $users = $dm->query('find username FROM User'); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  61. 61. Paging Results $users = $dm->query('find all FROM User limit 30 skip 30'); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  62. 62. Selecting Slice of Embedded Documents $post = $dm->query('find title, comments limit 20 skip 10 FROM BlogPost WHERE id = ?', array($id)); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  63. 63. Other Examples // Find all posts greater than or equal to a date $posts = $dm->query('find all FROM BlogPost WHERE createdAt >= ?', array($date)); // Find all posts sorted by created at desc $posts = $dm->query('find all FROM BlogPost sort createdAt desc'); // Update user $dm->query('update DocumentsUser set password = ? where username = ?', array('newpassword', 'jwage')); Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  64. 64. Lifecycle Events Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  65. 65. “A lifecycle event is a regular event with the additional feature of providing a mechanism to register direct callbacks inside the corresponding document classes that are executed when the lifecycle event occurs.” http://www.doctrine-project.org/projects/mongodb_odm/1.0/docs/reference/events/en#lifecycle-callbacks Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  66. 66. • preRemove - The preRemove event occurs for a given document before the respective DocumentManager remove operation for that document is executed. • postRemove - The postRemove event occurs for an document after the document has been removed. It will be invoked after the database delete operations. • prePersist - The prePersist event occurs for a given document before the respective DocumentManager persist operation for that document is executed. • postPersist - The postPersist event occurs for an document after the document has been made persistent. It will be invoked after the database insert operations. Generated primary key values are available in the postPersist event. • preUpdate - The preUpdate event occurs before the database update operations to document data. • postUpdate - The postUpdate event occurs after the database update operations to document data. • postLoad - The postLoad event occurs for an document after the document has been loaded into the current DocumentManager from the database or after the refresh operation has been applied to it. Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  67. 67. Event Examples Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  68. 68. /** * @Document * @HasLifecycleCallbacks */ class BlogPost { /** @Id */ public $id; /** @Date */ public $createdAt; /** @Date */ public $updatedAt; /** @PreUpdate */ public function prePersist() { $this->createdAt = new DateTime(); } /** @PreUpdate */ public function preUpdate() { $this->updatedAt = new DateTime(); } } Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  69. 69. Migrating Data Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  70. 70. Initial Document /** * @Document */ class User { /** @Id */ public $id; /** @String */ public $name; } Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  71. 71. New Document /** * @Document */ class User { /** @Id */ public $id; /** @String */ public $firstName; /** @String */ public $lastName; } Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  72. 72. Migrate Documents With Old Field Name /** * @Document * @HasLifecycleCallbacks */ class User { /** @Id */ public $id; /** @String */ public $firstName; /** @String */ public $lastName; /** @PreLoad */ public function preLoad(array &$data) { if (isset($data['name'])) { $e = explode(' ', $data['name']); unset($data['name']); $data['firstName'] = $e[0]; $data['lastName'] = $e[1]; } } Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  73. 73. Questions? Jonathan H. Wage • http://www.twitter.com/jwage • http://www.jwage.com • http://www.facebook.com/jwage You can contact Jonathan about Doctrine and Open-Source or for training, consulting, application development, or business related questions at jonathan.wage@sensio.com Doctrine MongoDB ODM www.doctrine-project.org www.sensiolabs.org
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×