SlideShare ist ein Scribd-Unternehmen logo
1 von 73
Downloaden Sie, um offline zu lesen
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                                           Doctrine
               MongoDB Object Document Mapper (ODM)




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                  What is Doctrine?



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                  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
                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




               What is MongoDB?
•   Key-Value document based storage
    system.

•   Bridge between traditional relational
    databases and key-value data stores.



                               http://www.mongodb.org

                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                #sfdaycgn




                                  Terminology

                        RDBMS                                        MongoDB
                            Database                                        Database

                               Table                                       Collection

                                Row                                        Document




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




    Using MongoDB in PHP



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                                     Connecting


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




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




               Selecting Databases


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




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




            Selecting Collections


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




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




           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'];




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




           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);




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                        Atomic Updates
•   Faster than saving the entire document.

•   Safer than updating the entire document.

•   Updates are done in place and are atomic.




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                        Atomic Updates
                     Update username and password where username is jwage



    $coll->update(array(
        'username' => 'jwage'
    ), array(
        '$set' => array(
            'username' => 'jonwage',
            'password' => md5('newpassword')
        )
    ));




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                            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




                                         www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




        Removing Documents


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




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




         Doctrine + MongoDB



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                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

                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                         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.


                                         www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                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




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                             #sfdaycgn




               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);
                                                }
                                            }




                                     www.doctrine-project.org                   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




    Mapping the Document
                                            /** @Document */
                                            class User
                                            {
                                                /** @Id */
                                                private $id;
                                                /** @String */
                                                private $username;
                                                /** @String */
                                                private $password;

                                                    // ...
                                            }




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                                 Ready to Go
      Doctrine now knows about this document and is able
                 to manage its persistent state




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




      Inserting, Updating and
       Deleting Documents


                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                  #sfdaycgn




           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);




                                     www.doctrine-project.org        www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




           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'
                          )
                      );




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




        Removing Documents

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

$dm->remove($user);
$dm->flush(); // removes document




                       $coll->remove(array('_id' => 'theid'));




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                                       Query API
                                           Fluent OO Query API




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




             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




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                   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




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




              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




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




              Querying Through
             Doctrine Query API
               // Find posts within a range of dates
               $posts = $dm->createQuery('Post')
                   ->field('createdAt')->range($startDate, $endDate)
                   ->execute();




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




           Updating Documents

               // Update a document
               $dm->createQuery('User')
                   ->update()
                   ->field('username')->set('jonwage')
                   ->field('password')->set('newpassword')
                   ->field('username')->equals('jwage')
                   ->execute();




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




        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();




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




      Embedded Documents



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                  class User
                  {
                      /** @Id */
                      public $id;

                           /** @String */
                           public $name;

                           /** @EmbedMany(targetDocument="Address") */
                           public $addresses = array();
                  }




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                #sfdaycgn




                                           /** @EmbeddedDocument */
                                           class Address
                                           {
                                               /** @String */
                                               public $address;

                                                  /** @String */
                                                  public $city;

                                                  /** @String */
                                                  public $state;

                                                  /** @String */
                                                  public $zipcode;
                                           }




                                     www.doctrine-project.org      www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




             $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();




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




             $users = array(
                 array(
                     'name' => 'Jonathan H. Wage',
                     'addresses' => array(
                         array(
                             'address' => '6512 Mercomatic Ct',
                             'city' => 'Nashville',
                             'state' => 'Tennesseee',
                             'zipcode' => '37209'
                         )
                     )
                 )
             );
             $coll->batchInsert($users);




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




              Updating Embedded
                 Documents
       Uses dot notation and atomic operators for updating




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




             $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'))
             );




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                   Add New Address



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




    $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'
                                 )
                             )
                         ))
                     );



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                    #sfdaycgn




    unset($user->addresses[0]->zipcode);
    $dm->flush();



                                 $coll->update(
                                     array('_id' => 'theuserid'),
                                     array(
                                         '$unset' => array(
                                             'addresses.0.zipcode'                   => 1
                                         )
                                     )
                                 );




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                                      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.




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                 #sfdaycgn




                                 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;
                                       }
                                 }




                                     www.doctrine-project.org       www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                  #sfdaycgn




                                                      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);
                            }
                       }




                                     www.doctrine-project.org      www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                   $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();




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                                       The Result



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                    #sfdaycgn




                       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
                               )

                       )




                                     www.doctrine-project.org          www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                               Working with
                                References



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




          $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();




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




 $organization = $dm->find('Organization', array('name' => 'Sensio Labs'));
 $users = $organization->getUsers(); // uninitialized collection

 // Queries database for users and initializes collection
 foreach ($users as $user)
 {
     // ...
 }




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                        Change Tracking



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                                 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.

                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                          Other Features



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                    Document Query
                       Language
       Language for querying documents in a similar way to
                              SQL




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                            BNF Grammar



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                                          #sfdaycgn


                 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]




                                     www.doctrine-project.org                 www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                         Creating Query


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




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                           Selecting Fields


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




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                              Paging Results


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




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




         Selecting Slice of
       Embedded Documents

$post = $dm->query('find title, comments limit 20 skip 10 FROM
BlogPost WHERE id = ?', array($id));




                                      www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                           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'));




                                        www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                          Lifecycle Events



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                    #sfdaycgn




“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




                                      www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn



•   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.

                                           www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                          Event Examples



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                 #sfdaycgn




                                /**
                                  * @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();
                                      }
                                }




                                     www.doctrine-project.org       www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                            Migrating Data



                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                       Initial Document
                                   /**
                                     * @Document
                                     */
                                   class User
                                   {
                                        /** @Id */
                                        public $id;
                                        /** @String */
                                        public $name;
                                   }




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                        New Document
                                 /**
                                   * @Document
                                   */
                                 class User
                                 {
                                      /** @Id */
                                      public $id;
                                      /** @String */
                                      public $firstName;
                                      /** @String */
                                      public $lastName;
                                 }




                                     www.doctrine-project.org   www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                                     #sfdaycgn




         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];
                                          }
                                      }




                                     www.doctrine-project.org           www.sensiolabs.org
Doctrine MongoDB Object Document Manager                                             #sfdaycgn




                                      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



                                     www.doctrine-project.org   www.sensiolabs.org

Weitere ähnliche Inhalte

Was ist angesagt?

MongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with MorphiaMongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with MorphiaScott Hernandez
 
PHP Data Objects
PHP Data ObjectsPHP Data Objects
PHP Data ObjectsWez Furlong
 
PHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php frameworkPHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php frameworkG Woo
 
Simplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaSimplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaMongoDB
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency InjectionRifat Nabi
 
Java development with MongoDB
Java development with MongoDBJava development with MongoDB
Java development with MongoDBJames Williams
 
Dependency Injection in Laravel
Dependency Injection in LaravelDependency Injection in Laravel
Dependency Injection in LaravelHAO-WEN ZHANG
 
Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3Fabien Potencier
 
Webinar: MongoDB Persistence with Java and Morphia
Webinar: MongoDB Persistence with Java and MorphiaWebinar: MongoDB Persistence with Java and Morphia
Webinar: MongoDB Persistence with Java and MorphiaMongoDB
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistenceHugo Hamon
 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring DataAnton Sulzhenko
 
Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleHugo Hamon
 
Drupal Field API. Practical usage
Drupal Field API. Practical usageDrupal Field API. Practical usage
Drupal Field API. Practical usagePavel Makhrinsky
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design PatternsHugo Hamon
 

Was ist angesagt? (19)

Doctrine and NoSQL
Doctrine and NoSQLDoctrine and NoSQL
Doctrine and NoSQL
 
Doctrine for NoSQL
Doctrine for NoSQLDoctrine for NoSQL
Doctrine for NoSQL
 
MongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with MorphiaMongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with Morphia
 
PHP Data Objects
PHP Data ObjectsPHP Data Objects
PHP Data Objects
 
PHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php frameworkPHP 5.3 and Lithium: the most rad php framework
PHP 5.3 and Lithium: the most rad php framework
 
Simplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaSimplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with Morphia
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
Java development with MongoDB
Java development with MongoDBJava development with MongoDB
Java development with MongoDB
 
Dependency Injection in Laravel
Dependency Injection in LaravelDependency Injection in Laravel
Dependency Injection in Laravel
 
Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3Dependency Injection with PHP and PHP 5.3
Dependency Injection with PHP and PHP 5.3
 
J query1
J query1J query1
J query1
 
J query
J queryJ query
J query
 
Webinar: MongoDB Persistence with Java and Morphia
Webinar: MongoDB Persistence with Java and MorphiaWebinar: MongoDB Persistence with Java and Morphia
Webinar: MongoDB Persistence with Java and Morphia
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring Data
 
Design Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et PimpleDesign Patterns avec PHP 5.3, Symfony et Pimple
Design Patterns avec PHP 5.3, Symfony et Pimple
 
Drupal Field API. Practical usage
Drupal Field API. Practical usageDrupal Field API. Practical usage
Drupal Field API. Practical usage
 
Database Design Patterns
Database Design PatternsDatabase Design Patterns
Database Design Patterns
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 

Ähnlich wie Symfony Day 2010 Doctrine MongoDB ODM

Java Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBJava Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBTobias Trelle
 
Webinar: Building Your First MongoDB App
Webinar: Building Your First MongoDB AppWebinar: Building Your First MongoDB App
Webinar: Building Your First MongoDB AppMongoDB
 
Building your first app with MongoDB
Building your first app with MongoDBBuilding your first app with MongoDB
Building your first app with MongoDBNorberto Leite
 
Getting started with MongoDB and Scala - Open Source Bridge 2012
Getting started with MongoDB and Scala - Open Source Bridge 2012Getting started with MongoDB and Scala - Open Source Bridge 2012
Getting started with MongoDB and Scala - Open Source Bridge 2012sullis
 
Morphia, Spring Data & Co.
Morphia, Spring Data & Co.Morphia, Spring Data & Co.
Morphia, Spring Data & Co.Tobias Trelle
 
MongoDB using Grails plugin by puneet behl
MongoDB using Grails plugin by puneet behlMongoDB using Grails plugin by puneet behl
MongoDB using Grails plugin by puneet behlTO THE NEW | Technology
 
Building Your First MongoDB App
Building Your First MongoDB AppBuilding Your First MongoDB App
Building Your First MongoDB AppHenrik Ingo
 
Building Your First Application with MongoDB
Building Your First Application with MongoDBBuilding Your First Application with MongoDB
Building Your First Application with MongoDBMongoDB
 
Dependency Injection in Spring in 10min
Dependency Injection in Spring in 10minDependency Injection in Spring in 10min
Dependency Injection in Spring in 10minCorneil du Plessis
 
MongoDB and Ruby on Rails
MongoDB and Ruby on RailsMongoDB and Ruby on Rails
MongoDB and Ruby on Railsrfischer20
 
How to use MongoDB with CakePHP
How to use MongoDB with CakePHPHow to use MongoDB with CakePHP
How to use MongoDB with CakePHPichikaway
 
BedCon 2013 - Java Persistenz-Frameworks für MongoDB
BedCon 2013 - Java Persistenz-Frameworks für MongoDBBedCon 2013 - Java Persistenz-Frameworks für MongoDB
BedCon 2013 - Java Persistenz-Frameworks für MongoDBTobias Trelle
 
Mongoose and MongoDB 101
Mongoose and MongoDB 101Mongoose and MongoDB 101
Mongoose and MongoDB 101Will Button
 
Mongodb Training Tutorial in Bangalore
Mongodb Training Tutorial in BangaloreMongodb Training Tutorial in Bangalore
Mongodb Training Tutorial in Bangalorerajkamaltibacademy
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBMongoDB
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBMongoDB
 
MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)Uwe Printz
 

Ähnlich wie Symfony Day 2010 Doctrine MongoDB ODM (20)

Java Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBJava Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDB
 
Webinar: Building Your First MongoDB App
Webinar: Building Your First MongoDB AppWebinar: Building Your First MongoDB App
Webinar: Building Your First MongoDB App
 
Building your first app with MongoDB
Building your first app with MongoDBBuilding your first app with MongoDB
Building your first app with MongoDB
 
Getting started with MongoDB and Scala - Open Source Bridge 2012
Getting started with MongoDB and Scala - Open Source Bridge 2012Getting started with MongoDB and Scala - Open Source Bridge 2012
Getting started with MongoDB and Scala - Open Source Bridge 2012
 
Morphia, Spring Data & Co.
Morphia, Spring Data & Co.Morphia, Spring Data & Co.
Morphia, Spring Data & Co.
 
MongoDB using Grails plugin by puneet behl
MongoDB using Grails plugin by puneet behlMongoDB using Grails plugin by puneet behl
MongoDB using Grails plugin by puneet behl
 
Building Your First MongoDB App
Building Your First MongoDB AppBuilding Your First MongoDB App
Building Your First MongoDB App
 
Building Your First Application with MongoDB
Building Your First Application with MongoDBBuilding Your First Application with MongoDB
Building Your First Application with MongoDB
 
Mongo learning series
Mongo learning series Mongo learning series
Mongo learning series
 
Dependency Injection in Spring in 10min
Dependency Injection in Spring in 10minDependency Injection in Spring in 10min
Dependency Injection in Spring in 10min
 
MongoDB and Ruby on Rails
MongoDB and Ruby on RailsMongoDB and Ruby on Rails
MongoDB and Ruby on Rails
 
Rails with mongodb
Rails with mongodbRails with mongodb
Rails with mongodb
 
How to use MongoDB with CakePHP
How to use MongoDB with CakePHPHow to use MongoDB with CakePHP
How to use MongoDB with CakePHP
 
BedCon 2013 - Java Persistenz-Frameworks für MongoDB
BedCon 2013 - Java Persistenz-Frameworks für MongoDBBedCon 2013 - Java Persistenz-Frameworks für MongoDB
BedCon 2013 - Java Persistenz-Frameworks für MongoDB
 
Mongoose and MongoDB 101
Mongoose and MongoDB 101Mongoose and MongoDB 101
Mongoose and MongoDB 101
 
Mongodb Training Tutorial in Bangalore
Mongodb Training Tutorial in BangaloreMongodb Training Tutorial in Bangalore
Mongodb Training Tutorial in Bangalore
 
MongoDB
MongoDBMongoDB
MongoDB
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDB
 
Dev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDBDev Jumpstart: Build Your First App with MongoDB
Dev Jumpstart: Build Your First App with MongoDB
 
MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)MongoDB for Coder Training (Coding Serbia 2013)
MongoDB for Coder Training (Coding Serbia 2013)
 

Mehr von Jonathan Wage

Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For BeginnersJonathan Wage
 
OpenSky Infrastructure
OpenSky InfrastructureOpenSky Infrastructure
OpenSky InfrastructureJonathan Wage
 
Doctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 ParisDoctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 ParisJonathan Wage
 
Doctrine in the Real World
Doctrine in the Real WorldDoctrine in the Real World
Doctrine in the Real WorldJonathan Wage
 
ZendCon2010 The Doctrine Project
ZendCon2010 The Doctrine ProjectZendCon2010 The Doctrine Project
ZendCon2010 The Doctrine ProjectJonathan Wage
 
Symfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 IntegrationSymfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 IntegrationJonathan Wage
 
Doctrine 2 - Enterprise Persistence Layer For PHP
Doctrine 2 - Enterprise Persistence Layer For PHPDoctrine 2 - Enterprise Persistence Layer For PHP
Doctrine 2 - Enterprise Persistence Layer For PHPJonathan Wage
 
Introduction To Doctrine 2
Introduction To Doctrine 2Introduction To Doctrine 2
Introduction To Doctrine 2Jonathan Wage
 
Doctrine 2 - Not The Same Old Php Orm
Doctrine 2 - Not The Same Old Php OrmDoctrine 2 - Not The Same Old Php Orm
Doctrine 2 - Not The Same Old Php OrmJonathan Wage
 
Doctrine 2: Enterprise Persistence Layer for PHP
Doctrine 2: Enterprise Persistence Layer for PHPDoctrine 2: Enterprise Persistence Layer for PHP
Doctrine 2: Enterprise Persistence Layer for PHPJonathan Wage
 
Sympal A Cmf Based On Symfony
Sympal   A Cmf Based On SymfonySympal   A Cmf Based On Symfony
Sympal A Cmf Based On SymfonyJonathan Wage
 
Symfony 1.3 + Doctrine 1.2
Symfony 1.3 + Doctrine 1.2Symfony 1.3 + Doctrine 1.2
Symfony 1.3 + Doctrine 1.2Jonathan Wage
 
Sympal - The flexible Symfony CMS
Sympal - The flexible Symfony CMSSympal - The flexible Symfony CMS
Sympal - The flexible Symfony CMSJonathan Wage
 
What's new in Doctrine
What's new in DoctrineWhat's new in Doctrine
What's new in DoctrineJonathan Wage
 
Sympal - Symfony CMS Preview
Sympal - Symfony CMS PreviewSympal - Symfony CMS Preview
Sympal - Symfony CMS PreviewJonathan Wage
 
Doctrine Php Object Relational Mapper
Doctrine Php Object Relational MapperDoctrine Php Object Relational Mapper
Doctrine Php Object Relational MapperJonathan Wage
 
Sympal - The Flexible Symfony Cms
Sympal - The Flexible Symfony CmsSympal - The Flexible Symfony Cms
Sympal - The Flexible Symfony CmsJonathan Wage
 
What's New In Doctrine
What's New In DoctrineWhat's New In Doctrine
What's New In DoctrineJonathan Wage
 

Mehr von Jonathan Wage (20)

Doctrine For Beginners
Doctrine For BeginnersDoctrine For Beginners
Doctrine For Beginners
 
OpenSky Infrastructure
OpenSky InfrastructureOpenSky Infrastructure
OpenSky Infrastructure
 
Doctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 ParisDoctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 Paris
 
Doctrine in the Real World
Doctrine in the Real WorldDoctrine in the Real World
Doctrine in the Real World
 
ZendCon2010 The Doctrine Project
ZendCon2010 The Doctrine ProjectZendCon2010 The Doctrine Project
ZendCon2010 The Doctrine Project
 
Libertyvasion2010
Libertyvasion2010Libertyvasion2010
Libertyvasion2010
 
Symfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 IntegrationSymfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 Integration
 
Doctrine 2 - Enterprise Persistence Layer For PHP
Doctrine 2 - Enterprise Persistence Layer For PHPDoctrine 2 - Enterprise Persistence Layer For PHP
Doctrine 2 - Enterprise Persistence Layer For PHP
 
Introduction To Doctrine 2
Introduction To Doctrine 2Introduction To Doctrine 2
Introduction To Doctrine 2
 
Doctrine 2 - Not The Same Old Php Orm
Doctrine 2 - Not The Same Old Php OrmDoctrine 2 - Not The Same Old Php Orm
Doctrine 2 - Not The Same Old Php Orm
 
Doctrine 2: Enterprise Persistence Layer for PHP
Doctrine 2: Enterprise Persistence Layer for PHPDoctrine 2: Enterprise Persistence Layer for PHP
Doctrine 2: Enterprise Persistence Layer for PHP
 
Sympal A Cmf Based On Symfony
Sympal   A Cmf Based On SymfonySympal   A Cmf Based On Symfony
Sympal A Cmf Based On Symfony
 
Symfony 1.3 + Doctrine 1.2
Symfony 1.3 + Doctrine 1.2Symfony 1.3 + Doctrine 1.2
Symfony 1.3 + Doctrine 1.2
 
Sympal - The flexible Symfony CMS
Sympal - The flexible Symfony CMSSympal - The flexible Symfony CMS
Sympal - The flexible Symfony CMS
 
What's new in Doctrine
What's new in DoctrineWhat's new in Doctrine
What's new in Doctrine
 
What Is Doctrine?
What Is Doctrine?What Is Doctrine?
What Is Doctrine?
 
Sympal - Symfony CMS Preview
Sympal - Symfony CMS PreviewSympal - Symfony CMS Preview
Sympal - Symfony CMS Preview
 
Doctrine Php Object Relational Mapper
Doctrine Php Object Relational MapperDoctrine Php Object Relational Mapper
Doctrine Php Object Relational Mapper
 
Sympal - The Flexible Symfony Cms
Sympal - The Flexible Symfony CmsSympal - The Flexible Symfony Cms
Sympal - The Flexible Symfony Cms
 
What's New In Doctrine
What's New In DoctrineWhat's New In Doctrine
What's New In Doctrine
 

Kürzlich hochgeladen

Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
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
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
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
 
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
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
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
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 

Kürzlich hochgeladen (20)

Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
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
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
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
 
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
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
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
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 

Symfony Day 2010 Doctrine MongoDB ODM

  • 1. Doctrine MongoDB Object Document Manager #sfdaycgn Doctrine MongoDB Object Document Mapper (ODM) www.doctrine-project.org www.sensiolabs.org
  • 2. Doctrine MongoDB Object Document Manager #sfdaycgn What is Doctrine? www.doctrine-project.org www.sensiolabs.org
  • 3. Doctrine MongoDB Object Document Manager #sfdaycgn 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 www.doctrine-project.org www.sensiolabs.org
  • 4. Doctrine MongoDB Object Document Manager #sfdaycgn What is MongoDB? • Key-Value document based storage system. • Bridge between traditional relational databases and key-value data stores. http://www.mongodb.org www.doctrine-project.org www.sensiolabs.org
  • 5. Doctrine MongoDB Object Document Manager #sfdaycgn Terminology RDBMS MongoDB Database Database Table Collection Row Document www.doctrine-project.org www.sensiolabs.org
  • 6. Doctrine MongoDB Object Document Manager #sfdaycgn Using MongoDB in PHP www.doctrine-project.org www.sensiolabs.org
  • 7. Doctrine MongoDB Object Document Manager #sfdaycgn Connecting $mongo = new Mongo('mongodb://localhost'); www.doctrine-project.org www.sensiolabs.org
  • 8. Doctrine MongoDB Object Document Manager #sfdaycgn Selecting Databases $mongo = new Mongo('mongodb://localhost'); $db = $mongo->selectDB('dbname'); www.doctrine-project.org www.sensiolabs.org
  • 9. Doctrine MongoDB Object Document Manager #sfdaycgn Selecting Collections $mongo = new Mongo('mongodb://localhost'); $db = $mongo->selectDB('dbname'); $coll = $db->selectCollection('users'); www.doctrine-project.org www.sensiolabs.org
  • 10. Doctrine MongoDB Object Document Manager #sfdaycgn 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']; www.doctrine-project.org www.sensiolabs.org
  • 11. Doctrine MongoDB Object Document Manager #sfdaycgn 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); www.doctrine-project.org www.sensiolabs.org
  • 12. Doctrine MongoDB Object Document Manager #sfdaycgn Atomic Updates • Faster than saving the entire document. • Safer than updating the entire document. • Updates are done in place and are atomic. www.doctrine-project.org www.sensiolabs.org
  • 13. Doctrine MongoDB Object Document Manager #sfdaycgn Atomic Updates Update username and password where username is jwage $coll->update(array( 'username' => 'jwage' ), array( '$set' => array( 'username' => 'jonwage', 'password' => md5('newpassword') ) )); www.doctrine-project.org www.sensiolabs.org
  • 14. Doctrine MongoDB Object Document Manager #sfdaycgn 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 www.doctrine-project.org www.sensiolabs.org
  • 15. Doctrine MongoDB Object Document Manager #sfdaycgn Removing Documents $coll->remove(array('username' => 'jwage')); www.doctrine-project.org www.sensiolabs.org
  • 16. Doctrine MongoDB Object Document Manager #sfdaycgn Doctrine + MongoDB www.doctrine-project.org www.sensiolabs.org
  • 17. Doctrine MongoDB Object Document Manager #sfdaycgn 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 www.doctrine-project.org www.sensiolabs.org
  • 18. Doctrine MongoDB Object Document Manager #sfdaycgn 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. www.doctrine-project.org www.sensiolabs.org
  • 19. Doctrine MongoDB Object Document Manager #sfdaycgn 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 www.doctrine-project.org www.sensiolabs.org
  • 20. Doctrine MongoDB Object Document Manager #sfdaycgn 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); } } www.doctrine-project.org www.sensiolabs.org
  • 21. Doctrine MongoDB Object Document Manager #sfdaycgn Mapping the Document /** @Document */ class User { /** @Id */ private $id; /** @String */ private $username; /** @String */ private $password; // ... } www.doctrine-project.org www.sensiolabs.org
  • 22. Doctrine MongoDB Object Document Manager #sfdaycgn Ready to Go Doctrine now knows about this document and is able to manage its persistent state www.doctrine-project.org www.sensiolabs.org
  • 23. Doctrine MongoDB Object Document Manager #sfdaycgn Inserting, Updating and Deleting Documents www.doctrine-project.org www.sensiolabs.org
  • 24. Doctrine MongoDB Object Document Manager #sfdaycgn 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); www.doctrine-project.org www.sensiolabs.org
  • 25. Doctrine MongoDB Object Document Manager #sfdaycgn 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' ) ); www.doctrine-project.org www.sensiolabs.org
  • 26. Doctrine MongoDB Object Document Manager #sfdaycgn Removing Documents $user = $dm->findOne('User', array('username' => 'jwage')); $dm->remove($user); $dm->flush(); // removes document $coll->remove(array('_id' => 'theid')); www.doctrine-project.org www.sensiolabs.org
  • 27. Doctrine MongoDB Object Document Manager #sfdaycgn Query API Fluent OO Query API www.doctrine-project.org www.sensiolabs.org
  • 28. Doctrine MongoDB Object Document Manager #sfdaycgn 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 www.doctrine-project.org www.sensiolabs.org
  • 29. Doctrine MongoDB Object Document Manager #sfdaycgn 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 www.doctrine-project.org www.sensiolabs.org
  • 30. Doctrine MongoDB Object Document Manager #sfdaycgn 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 www.doctrine-project.org www.sensiolabs.org
  • 31. Doctrine MongoDB Object Document Manager #sfdaycgn Querying Through Doctrine Query API // Find posts within a range of dates $posts = $dm->createQuery('Post') ->field('createdAt')->range($startDate, $endDate) ->execute(); www.doctrine-project.org www.sensiolabs.org
  • 32. Doctrine MongoDB Object Document Manager #sfdaycgn Updating Documents // Update a document $dm->createQuery('User') ->update() ->field('username')->set('jonwage') ->field('password')->set('newpassword') ->field('username')->equals('jwage') ->execute(); www.doctrine-project.org www.sensiolabs.org
  • 33. Doctrine MongoDB Object Document Manager #sfdaycgn 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(); www.doctrine-project.org www.sensiolabs.org
  • 34. Doctrine MongoDB Object Document Manager #sfdaycgn Embedded Documents www.doctrine-project.org www.sensiolabs.org
  • 35. Doctrine MongoDB Object Document Manager #sfdaycgn class User { /** @Id */ public $id; /** @String */ public $name; /** @EmbedMany(targetDocument="Address") */ public $addresses = array(); } www.doctrine-project.org www.sensiolabs.org
  • 36. Doctrine MongoDB Object Document Manager #sfdaycgn /** @EmbeddedDocument */ class Address { /** @String */ public $address; /** @String */ public $city; /** @String */ public $state; /** @String */ public $zipcode; } www.doctrine-project.org www.sensiolabs.org
  • 37. Doctrine MongoDB Object Document Manager #sfdaycgn $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(); www.doctrine-project.org www.sensiolabs.org
  • 38. Doctrine MongoDB Object Document Manager #sfdaycgn $users = array( array( 'name' => 'Jonathan H. Wage', 'addresses' => array( array( 'address' => '6512 Mercomatic Ct', 'city' => 'Nashville', 'state' => 'Tennesseee', 'zipcode' => '37209' ) ) ) ); $coll->batchInsert($users); www.doctrine-project.org www.sensiolabs.org
  • 39. Doctrine MongoDB Object Document Manager #sfdaycgn Updating Embedded Documents Uses dot notation and atomic operators for updating www.doctrine-project.org www.sensiolabs.org
  • 40. Doctrine MongoDB Object Document Manager #sfdaycgn $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')) ); www.doctrine-project.org www.sensiolabs.org
  • 41. Doctrine MongoDB Object Document Manager #sfdaycgn Add New Address www.doctrine-project.org www.sensiolabs.org
  • 42. Doctrine MongoDB Object Document Manager #sfdaycgn $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' ) ) )) ); www.doctrine-project.org www.sensiolabs.org
  • 43. Doctrine MongoDB Object Document Manager #sfdaycgn unset($user->addresses[0]->zipcode); $dm->flush(); $coll->update( array('_id' => 'theuserid'), array( '$unset' => array( 'addresses.0.zipcode' => 1 ) ) ); www.doctrine-project.org www.sensiolabs.org
  • 44. Doctrine MongoDB Object Document Manager #sfdaycgn 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. www.doctrine-project.org www.sensiolabs.org
  • 45. Doctrine MongoDB Object Document Manager #sfdaycgn 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; } } www.doctrine-project.org www.sensiolabs.org
  • 46. Doctrine MongoDB Object Document Manager #sfdaycgn 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); } } www.doctrine-project.org www.sensiolabs.org
  • 47. Doctrine MongoDB Object Document Manager #sfdaycgn $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(); www.doctrine-project.org www.sensiolabs.org
  • 48. Doctrine MongoDB Object Document Manager #sfdaycgn The Result www.doctrine-project.org www.sensiolabs.org
  • 49. Doctrine MongoDB Object Document Manager #sfdaycgn 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 ) ) www.doctrine-project.org www.sensiolabs.org
  • 50. Doctrine MongoDB Object Document Manager #sfdaycgn Working with References www.doctrine-project.org www.sensiolabs.org
  • 51. Doctrine MongoDB Object Document Manager #sfdaycgn $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(); www.doctrine-project.org www.sensiolabs.org
  • 52. Doctrine MongoDB Object Document Manager #sfdaycgn $organization = $dm->find('Organization', array('name' => 'Sensio Labs')); $users = $organization->getUsers(); // uninitialized collection // Queries database for users and initializes collection foreach ($users as $user) { // ... } www.doctrine-project.org www.sensiolabs.org
  • 53. Doctrine MongoDB Object Document Manager #sfdaycgn Change Tracking www.doctrine-project.org www.sensiolabs.org
  • 54. Doctrine MongoDB Object Document Manager #sfdaycgn 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. www.doctrine-project.org www.sensiolabs.org
  • 55. Doctrine MongoDB Object Document Manager #sfdaycgn Other Features www.doctrine-project.org www.sensiolabs.org
  • 56. Doctrine MongoDB Object Document Manager #sfdaycgn Document Query Language Language for querying documents in a similar way to SQL www.doctrine-project.org www.sensiolabs.org
  • 57. Doctrine MongoDB Object Document Manager #sfdaycgn BNF Grammar www.doctrine-project.org www.sensiolabs.org
  • 58. Doctrine MongoDB Object Document Manager #sfdaycgn 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] www.doctrine-project.org www.sensiolabs.org
  • 59. Doctrine MongoDB Object Document Manager #sfdaycgn Creating Query $users = $dm->query('find all FROM User'); www.doctrine-project.org www.sensiolabs.org
  • 60. Doctrine MongoDB Object Document Manager #sfdaycgn Selecting Fields $users = $dm->query('find username FROM User'); www.doctrine-project.org www.sensiolabs.org
  • 61. Doctrine MongoDB Object Document Manager #sfdaycgn Paging Results $users = $dm->query('find all FROM User limit 30 skip 30'); www.doctrine-project.org www.sensiolabs.org
  • 62. Doctrine MongoDB Object Document Manager #sfdaycgn Selecting Slice of Embedded Documents $post = $dm->query('find title, comments limit 20 skip 10 FROM BlogPost WHERE id = ?', array($id)); www.doctrine-project.org www.sensiolabs.org
  • 63. Doctrine MongoDB Object Document Manager #sfdaycgn 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')); www.doctrine-project.org www.sensiolabs.org
  • 64. Doctrine MongoDB Object Document Manager #sfdaycgn Lifecycle Events www.doctrine-project.org www.sensiolabs.org
  • 65. Doctrine MongoDB Object Document Manager #sfdaycgn “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 www.doctrine-project.org www.sensiolabs.org
  • 66. Doctrine MongoDB Object Document Manager #sfdaycgn • 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. www.doctrine-project.org www.sensiolabs.org
  • 67. Doctrine MongoDB Object Document Manager #sfdaycgn Event Examples www.doctrine-project.org www.sensiolabs.org
  • 68. Doctrine MongoDB Object Document Manager #sfdaycgn /** * @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(); } } www.doctrine-project.org www.sensiolabs.org
  • 69. Doctrine MongoDB Object Document Manager #sfdaycgn Migrating Data www.doctrine-project.org www.sensiolabs.org
  • 70. Doctrine MongoDB Object Document Manager #sfdaycgn Initial Document /** * @Document */ class User { /** @Id */ public $id; /** @String */ public $name; } www.doctrine-project.org www.sensiolabs.org
  • 71. Doctrine MongoDB Object Document Manager #sfdaycgn New Document /** * @Document */ class User { /** @Id */ public $id; /** @String */ public $firstName; /** @String */ public $lastName; } www.doctrine-project.org www.sensiolabs.org
  • 72. Doctrine MongoDB Object Document Manager #sfdaycgn 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]; } } www.doctrine-project.org www.sensiolabs.org
  • 73. Doctrine MongoDB Object Document Manager #sfdaycgn 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 www.doctrine-project.org www.sensiolabs.org