Find and Modify

Note

From MongoDB.org:

MongoDB supports a "find, modify, and return" command. This command can be used to atomically modify a document (at most one) and return it. Note that, by default, the document returned will not include the modifications made on the update.

Doctrine fully integrates the find and modify functionality to the query builder object so you can easily run these types of queries!

Update

For example you can update a job and return it:

<?php

$job = $dm->createQueryBuilder('Job')
    // Find the job
    ->findAndUpdate()
    ->field('in_progress')->equals(false)
    ->sort('priority', 'desc')

    // Update found job
    ->field('started')->set(new \MongoDate())
    ->field('in_progress')->set(true)
    ->getQuery()
    ->execute();

If you want to update a job and return the new document you can call the returnNew() method.

Here is an example where we return the new updated job document:

<?php
$job = $dm->createQueryBuilder('Job')
    // Find the job
    ->findAndUpdate()
    ->returnNew()
    ->field('in_progress')->equals(false)
    ->sort('priority', 'desc')

    // Update found job
    ->field('started')->set(new \MongoDate())
    ->field('in_progress')->set(true)
    ->getQuery()
    ->execute();

The returned $job will be a managed Job instance with the started and in_progress fields updated.

Remove

You can also remove a document and return it:

<?php

$job = $dm->createQueryBuilder('Job')
    ->findAndRemove()
    ->sort('priority', 'desc')
    ->getQuery()
    ->execute();

You can read more about the find and modify functionality on the MongoDB website.

Note

If you don't need to return the document, you can use just run a normal update which can affect multiple documents, as well. For multiple update to happen you need to use ->updateMany() method of the builder (or update()->multiple() combination that was deprecated in version 1.2).

Fork me on GitHub