MongoCollection::findAndModify

(PECL mongo >=1.3.0)

MongoCollection::findAndModifyОбновляет документ и возвращает его

Описание

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

Команда findAndModify атомарно изменяет и возвращает один документ. По умолчанию возвращенный документ не содержит изменений, внесенных в обновление. Чтобы вернуть документ с изменениями, внесенными в обновление, используйте параметр new.

Список параметров

query

Критерии запроса для поиска.

update

Критерии обновления.

fields

Необязательно, вернуть только эти поля.

options

Массив опций, которые нужно применить, например удалить документ соответствия из БД и вернуть его.

Опция Описание
sort array Определяет, какой документ будет изменен операцией, если запрос выбирает несколько документов. findAndModify изменит первый документ в порядке сортировки, заданном этим аргументом.
remove boolean Необязательно, если поле update существует. Когда TRUE, удаляет выбранный документ. Значением по умолчанию является FALSE.
update array Необязательно, если поле remove существует. Выполняет обновление выбранного документа.
new boolean Необязательный. Когда TRUE, возвращает измененный документ, а не оригинал. Метод findAndModify игнорирует параметр new для операций удаления. Значением по умолчанию является FALSE.
upsert boolean Необязательный. Используется вместе с полем update. Когда TRUE, команда findAndModify создает новый документ, если запрос не возвращает документов. По умолчанию установлено значение false. В MongoDB 2.2 команда findAndModify возвращает NULL, когда upsert равен TRUE.

Возвращаемые значения

Возвращает исходный документ или измененный документ, если установлен new.

Ошибки

Выдает исключение MongoResultException при сбое.

Примеры

Пример #1 Пример использования 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);
?>

Результатом выполнения данного примера будет что-то подобное:

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

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

Смотрите также

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