PHP 8.0.6 Released!

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 bool Необязательно, если поле update существует. Когда true, удаляет выбранный документ. Значением по умолчанию является false.
update array Необязательно, если поле remove существует. Выполняет обновление выбранного документа.
new bool Необязательный. Когда true, возвращает изменённый документ, а не оригинал. Метод findAndModify игнорирует параметр new для операций удаления. Значением по умолчанию является false.
upsert bool Необязательный. Используется вместе с полем 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
2
Barmy
7 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