Domanda

è possibile ottenere il nuovo _id / aggiornato dopo l'interrogazione? esempio di codice:

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

$ chiave non sta tenendo il nuovo / vecchio oggetto _id e presumo che i dati $ non lo faranno o perché il suo solo un'istruzione.

È stato utile?

Soluzione

Sì -. E 'possibile utilizzare una singola query

MongoDB include un comando findAndModify che può atomicamente modificare un documento e restituirlo (di default in realtà restituisce il documento prima che sia stato modificato).

I driver PHP non includono un metodo conveniente per questo sulla classe di raccolta (ancora - check out questo bug ), ma può ancora essere utilizzato (nota che il mio PHP è terribile, quindi può benissimo aver fatto un errore di sintassi nel seguente frammento):

$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'];

Altri suggerimenti

Nel caso in cui inciampa qualcuno dall'altra parte questa domanda come ho fatto io, Mongo effettivamente modificare la matrice di ingresso quando si chiama MongoCollection-> save (); - aggiungendo l'id fino alla fine. Quindi, se si chiama:

$test = array('test'=>'testing');
mongocollection->save($test);
echo $test['_id'];

Si avrà l'id Mongo per quell'oggetto.

mi sono imbattuto in questo problema e ha lavorato intorno ad esso tramite una query indietro il _id dopo l'upsert. Ho pensato di aggiungere un po 'dei miei risultati nel caso sono utili a chi viene qui alla ricerca di informazioni.

Quando i risultati upsert in un nuovo documento in fase di creazione della collezione, l'oggetto restituito contiene il _id (qui c'è un print_r di un esempio):

Array

(

[updatedExisting] => 0

[upserted] => MongoId Object
    (
        [$id] => 506dc50614c11c6ebdbc39bc
    )

[n] => 1
[connectionId] => 275
[fsyncFiles] => 7
[err] => 
[ok] => 1
)

È possibile ottenere il _id da questo:

$id = (string)$obj['upserted'];

Tuttavia, se l'upsert ha comportato un documento esistente in fase di aggiornamento quindi l'oggetto restituito non contiene _id.

Dare a questo un colpo:

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

Quindi, diciamo che il $id passato è nullo, viene creato un MongoId fresco, altrimenti solo converte il $id esistente a un oggetto MongoId.

Spero che questo aiuti: D

Il metodo di aggiornamento restituisce un array con l'ID del documento UPSERTED:

Array
(
    [ok] => 1
    [nModified] => 0
    [n] => 1
    [err] => 
    [errmsg] => 
    [upserted] => MongoId Object
        (
            [$id] => 5511da18c8318aa1701881dd
        )
    [updatedExisting] => 
)

È anche possibile impostare fsync su true in un aggiornamento / upsert, per ottenere il _id restituito alla oggetto che è stato passato al l'aggiornamento.

$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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top