получить mongodb _id объект после upsert с php

возможно ли получить новый / обновленный _id после запроса? пример кода:

$key = array( 'something' => 'unique' ); $data = array( '$inc' => array( 'someint' => 1 ) ); $mongodb->db->collection->update( $key, $data, array( 'upsert' => true ) ); 

$ key не держит новый / старый объект _id, и я предполагаю, что $ data не будет либо потому, что его просто инструкция.

Solutions Collecting From Web of "получить mongodb _id объект после upsert с php"

Да – возможно использование одного запроса.

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.