Sí - es posible utilizar una sola consulta.
MongoDB incluye un comando findAndModify
que puede modificar atómicamente un documento y devolverlo (de forma predeterminada, realmente devuelve el documento antes de que se haya modificado).
Los controladores de PHP no incluyen un método conveniente para esto en la clase de colección (sin embargo, consulte this bug), pero aún se puede usar (tenga en cuenta que mi PHP es terrible, por lo que puedo haber hecho un error de sintaxis en el siguiente fragmento):
$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'];
Ahh - la 'findAndModify' que tan rara vez lo utilizan siempre olvido que existe :) - Es bueno que se pruebe que está mal ocasionalmente;) – gnarf
@gnarf: No se preocupe.Lo que me parece extraño es que no hay una forma de obtener el _id automáticamente en PHP. Estoy acostumbrado a los controladores de Python que devuelven el _id en cada [upsert] (http://api.mongodb.org/ python/1.9% 2B/api/pymongo/collection.html # pymongo.collection.Collection.save) – Cameron