MongoDB найти и удалить - самый быстрый способ - PullRequest
12 голосов
/ 17 декабря 2011

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

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

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

Ответы [ 4 ]

14 голосов
/ 17 декабря 2011

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

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

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

8 голосов
/ 12 февраля 2014

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

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

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

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

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

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

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

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

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

0 голосов
/ 17 декабря 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...