2011-12-16 16 views
11

Tengo una pregunta rápida, ¿cuál es la manera más rápida de agarrar y eliminar un objeto de una colección mongo. Aquí está el código, tengo actualmente:MongoDB buscar y eliminar - la manera más rápida

$cursor = $coll->find()->sort(array('created' => 1))->limit(1); 
$obj = $cursor->getNext(); 
$coll->remove(array('name' => $obj['name'])); 

como se puede ver por encima de ella agarra un documento de la base de datos y lo elimina (por lo que no se procesa de nuevo). Por muy rápido que esto sea, necesito que funcione más rápido. El desafío es que tenemos múltiples procesos haciendo esto y procesando lo que han encontrado PERO a veces dos o más de los procesos toman el mismo documento y, por lo tanto, hacen duplicados. Básicamente, necesito hacerlo para que un documento solo pueda ser capturado una vez. Entonces, cualquier idea sería muy apreciada.

Respuesta

14

Peter, Es difícil decir cuál es la mejor solución aquí sin entender todo el contexto, pero un enfoque que puede usar es findAndModify. Esto buscará un único documento y lo devolverá, y también le aplicará una actualización.

Puede usar esto para buscar un documento para procesar y simultáneamente modificar un campo de "estado" para marcarlo como procesado, para que otros trabajadores puedan reconocerlo como tal e ignorarlo.

Hay aquí un ejemplo que puede ser útil: http://docs.mongodb.org/manual/reference/command/findAndModify/

+0

esto es exactamente lo que necesito. Gracias a todos. Simplemente curioso, pero ¿cómo se vería este comando en PHP? Actualmente estoy investigando esto, pero si pudieran darme un ejemplo, sería genial. Si descubro cómo primero, publicaré el código para que todos lo vean. – PetersCodeProblems

+3

$ db-> command (array ('findandmodify' => 'CollectionName', 'sort' => array ('created' => 1), 'limit' => 1, 'remove' => true)); – PetersCodeProblems

+0

Ese es el comando para php – PetersCodeProblems

-4

Soy nuevo en mongodb y no del todo seguro de lo que su consulta está tratando de hacer, pero aquí es la forma en que lo haría

# suppose database is staging 
# suppose collection is data 
use staging 
db.data.remove(<your_query_criteria>) 

donde es un mapa y puede contener cualquier criterio de búsqueda que desee

No estoy seguro de si esto podría ayudarlo.

7

utilizar la función findAndRemove como se documenta aquí: http://api.mongodb.org/java/current/com/mongodb/DBCollection.html

La función findAndRemove recuperar y objeto a partir de la base de datos mongo y eliminarlo en una sola operación (atómica).

findAndRemove (consulta, tipo [, opciones], devolución de llamada)

  • El objeto de consulta se utiliza para recuperar el objeto de la base de datos (ver collection.find())
  • se utiliza el parámetro de clasificación para ordenar los resultados (en el caso de muchos, donde se encuentran)
+1

Ese enlace puede contener la respuesta, pero por favor agregue los detalles relevantes de ese enlace a su respuesta. Los enlaces se rompen. – rene

+1

Parece que en MongoDB 3 java API findAndRemove ha sido reemplazado por findOneAndDelete() 'TDocument findOneAndDelete (filtro Bson, opciones FindOneAndDeleteOptions);' – titusn

1

hago una nueva respuesta a remarcar el hecho:

Como se ha comentado por @peterscodeproblems en el acce respuesta pted. La forma nativa de esto en mongodb en este momento es el uso de los

findAndModify(query=<document>, remove=True) 

Como ha señalado el documentation.

Como es nativo y atómico, espero que esta sea la forma más rápida de hacerlo.

Cuestiones relacionadas