コマンドラインで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 コレクションから削除することを繰り返します。ただし、これは、クライアント上のすべてを取得してサーバーに保存するには、多くの帯域幅のようです。
助言がありますか?