возможно ли получить новый / обновленный _id после запроса? пример кода:
$key = array( 'something' => 'unique' ); $data = array( '$inc' => array( 'someint' => 1 ) ); $mongodb->db->collection->update( $key, $data, array( 'upsert' => true ) );
$ key не держит новый / старый объект _id, и я предполагаю, что $ data не будет либо потому, что его просто инструкция.
Да – возможно использование одного запроса.
MongoDB включает команду findAndModify
которая может атомарно изменять документ и возвращать его (по умолчанию он фактически возвращает документ до его изменения).
Драйверы PHP не включают в себя удобный метод для этого в классе коллекции (еще – проверьте эту ошибку ), но он все равно может быть использован (обратите внимание, что мой PHP ужасен, поэтому я вполне мог бы сделать синтаксическую ошибку в следующем фрагменте):
$key = array( 'something' => 'unique' ); $data = array( '$inc' => array( 'someint' => 1 ) ); $result = $mongodb->db->command( array( 'findAndModify' => 'collection', 'query' => $key, 'update' => $data, 'new' => true, # To get back the document after the upsert 'upsert' => true, 'fields' => array( '_id' => 1 ) # Only return _id field ) ); $id = $result['value']['_id'];
На всякий случай кто-то наткнулся на этот вопрос, как я, Mongo на самом деле изменит входной массив, когда вы вызовете MongoCollection-> save (); – добавление идентификатора в конец. Итак, если вы позвоните:
$test = array('test'=>'testing'); mongocollection->save($test); echo $test['_id'];
У вас будет идентификатор mongo для этого объекта.
Я столкнулся с этой проблемой и работал вокруг нее, обратившись обратно к _id после upsert. Я думал, что добавлю некоторые мои выводы, если они будут полезны всем, кто приходит сюда, ища информацию.
Когда upsert приводит к созданию нового документа в коллекции, возвращаемый объект содержит _id (вот пример print_r):
Array ( [updatedExisting] => 0 [upserted] => MongoId Object ( [$id] => 506dc50614c11c6ebdbc39bc ) [n] => 1 [connectionId] => 275 [fsyncFiles] => 7 [err] => [ok] => 1 )
Вы можете получить _id из этого:
$id = (string)$obj['upserted'];
Однако, если upsert привел к обновлению существующего документа, возвращаемый объект не содержит _id.
Сделайте снимок:
function save($data, $id = null) { $mongo_id = new MongoId($id); $criteria = array('_id' => $mongo_id); // Wrap a '$set' around the passed data array for convenience $update = array('$set' => $data); $collection->update($criteria, $update, array('upsert' => true)); }
Итак, допустим, что переданный $id
равен null, создается новый MongoId
, иначе он просто преобразует существующий $id
в объект MongoId.
Надеюсь, это поможет: D
Метод update возвращает массив с идентификатором документа UPSERTED:
Array ( [ok] => 1 [nModified] => 0 [n] => 1 [err] => [errmsg] => [upserted] => MongoId Object ( [$id] => 5511da18c8318aa1701881dd ) [updatedExisting] => )
Вы также можете установить fsync в true в update / upsert, чтобы вернуть _id к объекту, который был передан обновлению.
$save = array ('test' => 'work'); $m->$collection->update(criteria, $save, array('fsync' => true, 'upsert' => true)); echo $save['_id']; //should have your _id of the obj just updated.