Коллекция блокировки PHP MongoDB execute()

Я использую MongoDB через командную строку, чтобы просмотреть кучу документов для определенного условия, перейти от одной коллекции к другой коллекции и удалить из исходной коллекции.

db.coll1.find({'status' : 'DELETED'}).forEach(
    function(e) {db.deleted.insert(e);  db.coll1.remove({_id:e._id});  });

Это работает, однако мне нужно написать сценарий, чтобы он перемещал все документы из coll1 в удаленную коллекцию каждый день (или каждый час) с помощью сценария cron. Я использую PHP, поэтому я решил написать скрипт, используя библиотеку Mongo PHP ::

$db->execute('db.coll1.find({'status' :'DELETED'}).forEach(
    function(e) {  db.deleted.insert(e); db.coll1.remove({_id:e._id});  })');

Это работает, но в отличие от командной строки Mongo, db->execute() игнорируется, что приводит к блокировке до тех пор, пока блок выполнения не завершится, что удерживает все записи в коллекцию. Я не могу сделать это в своей производственной среде.

Есть ли способ (без ручного входа в Mongo и запуска команды) и выполнения ее через PHP-скрипт без блокировки?

Если я использую:

db->selectCollection('coll1')->find(array('status' => 'DELETED')) 

и повторите это, я могу выбрать документы, сохранить в удаленной коллекции и удалить из коллекции coll1. Однако это кажется большой пропускной способностью, чтобы вытащить все на клиенте и сохранить его обратно на сервер.

Какие-либо предложения?


person marko.vujo    schedule 02.10.2012    source источник


Ответы (1)


Есть ли способ (без ручного входа в Mongo и запуска команды) и выполнения ее через PHP-скрипт без блокировки?

Как вы сказали, лучше всего сделать это на стороне клиента. Что касается пропускной способности, если у вас нет сети до 90-х годов, то, скорее всего, это будет очень небольшая пропускная способность по сравнению с тем, сколько вы использовали бы для всего остального, включая наборы реплик и т. д.

Что вы могли бы сделать, так это складировать ваши удаления при их фактическом удалении (в вашем приложении), а не один раз в день, а затем вы бы один раз в день возвращались к исходной коллекции, удаляя все удаленные строки. Таким образом, пропускная способность будет распределена в течение дня, и когда дело доходит до очистки вашего производства, вы просто выполняете одну команду удаления.

Другой альтернативой было бы использовать MR и сделать его output этой коллекцией.

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

person Sammaye    schedule 02.10.2012
comment
Спасибо за ответ и время - person marko.vujo; 09.10.2012