Я использую MongoDB над командной строкой, чтобы пройти цикл через кучу документов для определенного условия, переходить из одной коллекции в другую и удалять из исходной коллекции.
db.coll1.find({'status' : 'DELETED'}).forEach( function(e) {db.deleted.insert(e); db.coll1.remove({_id:e._id}); });
Это работает, однако мне нужно написать сценарий, поэтому он перемещает все документы в coll1 в удаленную коллекцию каждый день (или каждый час) с помощью скрипта cron. Я использую PHP, поэтому я решил написать сценарий, используя Mongo PHP Library ::
$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. Однако это похоже на большую пропускную способность, чтобы вытащить все на клиент и сохранить его обратно на сервер.
Какие-либо предложения?
Есть ли способ (без ручного входа в Mongo и выполнения команды) и выполнения его с помощью PHP-скрипта без блокировки?
Как вы заявили, лучше всего сделать это на стороне клиента. Что касается полосы пропускания, если у вас нет сети до 90-х, тогда она, скорее всего, будет очень небольшой пропускной способностью по сравнению с тем, сколько вы будете использовать для всего остального, включая наборы реплик и т. Д.
То, что вы можете сделать, – это складировать ваши удаления при их фактическом удалении (в вашем приложении), а не один раз в день, а затем один раз в день возвращать исходную коллекцию, удаляя все удаленные строки. Таким образом, пропускная способность будет распространяться в течение дня, и когда дело доходит до очистки вашего производства, вы просто выполняете одну команду удаления.
Другой альтернативой было бы использование MR и сделать его output
таким сборником.
Хотя в целом складирование удаляет таким образом, как правило, больше работы, чем того стоит. Обычно лучше просто держать их в своей основной коллекции и обрабатывать свои запросы вокруг удалённого флага (как вы, вероятно, уже сделали, чтобы не сразу их хранить).