MongoDB найти и удалить - самый быстрый способ

У меня есть быстрый вопрос: какой быстрый способ захватить и удалить объект из коллекции mongo. Вот код, который у меня есть:

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

как вы можете видеть выше, он захватывает один документ из базы данных и удаляет его (поэтому он не обрабатывается снова). Как бы быстро это ни было, мне нужно, чтобы он работал быстрее. Задача состоит в том, что у нас есть несколько процессов, которые делают это, и обрабатывают то, что они нашли, но иногда два или более процессов захватывают один и тот же документ, поэтому делают дубликаты. В принципе, мне нужно сделать так, чтобы документ можно было схватить только один раз. Поэтому любые идеи были бы очень оценены.

Ответ 1

Петр, Трудно сказать, какое лучшее решение здесь, не понимая весь контекст, но один подход, который вы могли бы использовать, - findAndModify. Это запросит для одного документа и вернет его, а также применит к нему обновление.

Вы можете использовать это, чтобы найти документ для обработки и одновременного изменения поля "статус", чтобы пометить его как обрабатываемое, чтобы другие работники могли распознавать его как таковое и игнорировать его.

Вот пример, который может быть полезен: http://docs.mongodb.org/manual/reference/command/findAndModify/

Ответ 2

Используйте функцию findAndRemove, как описано здесь: http://api.mongodb.org/java/current/com/mongodb/DBCollection.html

Функция findAndRemove извлекает и объект из базы данных mongo и удаляет ее в одиночной (атомной) операции.

findAndRemove (запрос, сортировка [, параметры], обратный вызов)

  • Объект запроса используется для извлечения объекта из базы данных (см. collection.find())
  • Параметр sort используется для сортировки результатов (в случае, если многие найдены)

Ответ 3

Я даю новый ответ, чтобы отметить тот факт:

Как прокомментировал @peterscodeproblems в принятом ответе. На настоящий момент в mongodb прямо сейчас используется

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

Как указано в документации.

Поскольку он является родным и атомарным, я ожидаю, что это будет более быстрый способ сделать это.

Ответ 4

Я новичок в mongodb и не совсем уверен, что ваш запрос пытается сделать, но вот как я это сделаю.

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

где это карта и может содержать любые критерии поиска, которые вы хотите

Не уверен, что это поможет вам.