(PECL mongo >=1.3.0)
MongoCollection::findAndModify — Actualizar un documento y devolverlo
$query
[, array $update
[, array $fields
[, array $options
]]] )El comando findAndModify modifica atómicamente y devuelve un único documento. Por omisión, el documento devuelto no incluye las modificaciones realizadas en la actualización. Para devolver el documento con las modificaciones hechas en la actualización, use la opción new.
query
Los criterios de consulta con los que buscar.
update
Los criterios de actualización.
fields
Devolver opcionalmente estos campos solamente.
options
Un array de opciones a aplicar, tal como eliminar el documento coincidente de la BD y devolverlo.
Opción | Descripción |
---|---|
sort array | Determina qué documento modificará la operación si la consulta selecciona varios. findAndModify modificará el primer documento en el orden especificado por este argumento. |
remove boolean |
Opcional si el campo update existe. Cuando es TRUE , elimina el documento
seleccionado. El valor predeterminado es FALSE .
|
update array | Opcional si existe el campo remove. Realiza una actualización del documento seleccionado. |
new boolean |
Opcional. Si es TRUE , devulve el documento modificado en lugar del
original. El método findAndModify ignora la opción new en
operaciones de eliminación. El valor predeterminado es FALSE .
|
upsert boolean |
Opcional. Usada junto con el campo update. Se es TRUE , el
comando findAndModify crea un nuevo documento si la consulta no devuelve
ningujo. El valor predeterminado es false. En MongoDB 2.2, el
comando findAndModify devuelve NULL cuando upsert es TRUE .
|
Devuelve el documento original, o el modificado si new está establecido.
Lanza una MongoResultException en case de error.
Ejemplo #1 Ejemplo de MongoCollection::findAndModify()
<?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);
?>
El resultado del ejemplo sería algo similar a:
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" } }
Ejemplo #2 Manejo de errores de MongoCollection::findAndModify()
<?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());
}
?>
El resultado del ejemplo sería algo similar a:
13097 : exception: Unsupported projection option: $pop array(3) { ["errmsg"]=> string(46) "exception: Unsupported projection option: $pop" ["code"]=> int(13097) ["ok"]=> float(0) }