(PECL mongo >=1.3.0)
MongoCollection::findAndModify — Update a document and return it
$query
   [, array $update
   [, array $fields
   [, array $options
  ]]] )The findAndModify command atomically modifies and returns a single document. By default, the returned document does not include the modifications made on the update. To return the document with the modifications made on the update, use the new option.
queryThe query criteria to search for.
updateThe update criteria.
fieldsOptionally only return these fields.
optionsAn array of options to apply, such as remove the match document from the DB and return it.
| Option | Описание | 
|---|---|
| sort array | Determines which document the operation will modify if the query selects multiple documents. findAndModify will modify the first document in the sort order specified by this argument. | 
| remove boolean | Optional if update field exists. When TRUE, removes the selected
           document. The default isFALSE. | 
| update array | Optional if remove field exists. Performs an update of the selected document. | 
| new boolean | Optional. When TRUE, returns the modified document rather than the
           original. The findAndModify method ignores the new option for
           remove operations. The default isFALSE. | 
| upsert boolean | Optional. Used in conjunction with the update field. When TRUE, the
           findAndModify command creates a new document if the query returns
           no documents. The default is false. In MongoDB 2.2, the
           findAndModify command returnsNULLwhen upsert isTRUE. | 
Returns the original document, or the modified document when new is set.
Throws MongoResultException on failure.
Пример #1 MongoCollection::findAndModify() example
<?php
$m = new Mongo;
$col = $m->selectDB("test")->jobs;
$col->insert(array(
     "name" => "Next promo",
     "inprogress" => false,
     "priority" => 0,
     "tasks" => array( "select product", "add inventory", "do placement"),
) );
$col->insert(array(
     "name" => "Biz report",
     "inprogress" => false,
     "priority" => 1,
     "tasks" => array( "run sales report", "email report" )
) );
$col->insert(array(
     "name" => "Biz report",
     "inprogress" => false,
     "priority" => 2,
     "tasks" => array( "run marketing report", "email report" )
    ),
    array("w" => 1)
);
$retval = $col->findAndModify(
     array("inprogress" => false, "name" => "Biz report"),
     array('$set' => array('inprogress' => true, "started" => new MongoDate())),
     null,
     array(
        "sort" => array("priority" => -1),
        "new" => true,
    )
);
var_dump($retval);
?>
Результатом выполнения данного примера будет что-то подобное:
array(6) {
  ["_id"]=>
  object(MongoId)#7 (1) {
    ["$id"]=>
    string(24) "5091b5b244415e8cc3000002"
  }
  ["inprogress"]=>
  bool(true)
  ["name"]=>
  string(10) "Biz report"
  ["priority"]=>
  int(2)
  ["started"]=>
  object(MongoDate)#8 (2) {
    ["sec"]=>
    int(1351726514)
    ["usec"]=>
    int(925000)
  }
  ["tasks"]=>
  array(2) {
    [0]=>
    string(20) "run marketing report"
    [1]=>
    string(12) "email report"
  }
}
Пример #2 MongoCollection::findAndModify() error handling
<?php
$m = new Mongo;
$col = $m->selectDB("test")->jobs;
try {
    $retval = $col->findAndModify(
         array("inprogress" => false, "name" => "Next promo"),
         array('$pop' => array("tasks" => -1)),
         array("tasks" => array('$pop' => array("stuff"))),
         array("new" => true)
    );
} catch(MongoResultException $e) {
    echo $e->getCode(), " : ", $e->getMessage(), "\n";
    var_dump($e->getDocument());
}
?>
Результатом выполнения данного примера будет что-то подобное:
13097 : exception: Unsupported projection option: $pop
array(3) {
  ["errmsg"]=>
  string(46) "exception: Unsupported projection option: $pop"
  ["code"]=>
  int(13097)
  ["ok"]=>
  float(0)
}