MongoCollection::findAndModify

(PECL mongo >=1.3.0)

MongoCollection::findAndModifyActualizar un documento y devolverlo

Descripción

public MongoCollection::findAndModify ( array $query [, array $update [, array $fields [, array $options ]]] ) : array

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.

Parámetros

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.

Valores devueltos

Devuelve el documento original, o el modificado si new está establecido.

Errores/Excepciones

Lanza una MongoResultException en case de error.

Ejemplos

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

Ver también

add a note add a note

User Contributed Notes 1 note

up
1
Barmy
10 years ago
There is an easy way to find and replace by _id :

<?php
// ...

// Selecting unparsed lines
$cursor = $collection->find(array("mydata_isParsed" => array('$ne' => 1)));

// Doing our stuff
foreach($cursor as $document) {
   
// should always be ok, just in case
   
if (!isset($document["mydata_isParsed"])) {
       
// ... do some stuff

        // flag as parsed and update line
       
$document["mydata_isParsed"] = 1;
       
$idField = '$id';
       
$collection->findAndModify(array("_id" => new MongoId($document["_id"]->$idField)), $document);
    }
}
To Top