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>)
где это карта и может содержать любые критерии поиска, которые вы хотите
Не уверен, что это поможет вам.