0

コマンドラインで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->e​​xecute() が評価され、実行ブロックが終了するまでロックが発生し、コレクションへのすべての書き込みが保留されます。私の本番環境ではそれができません。

(Mongoに手動でログインしてコマンドを実行せずに)ロックせずにPHPスクリプトを介して実行する方法はありますか?

私が使用する場合:

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

ドキュメントを選択し、削除されたコレクションに保存し、coll1 コレクションから削除することを繰り返します。ただし、これは、クライアント上のすべてを取得してサーバーに保存するには、多くの帯域幅のようです。

助言がありますか?

4

1 に答える 1