9

PHP の Mongo ドライバーには renameCommand 関数がありません。管理データベースを介してこれを行うための参照があります。しかし、Mongo ドライバーの最近のバージョンでは、管理データベースへのログイン権限がない場合、管理データベースを「使用」できないようです。したがって、この方法は機能しなくなりました。また、これはシャード環境では機能しないことも読みましたが、これは現在私にとっては問題ではありません.

人々が持っていると思われる他の提案は、「from」コレクションを繰り返し処理し、「to」コレクションに挿入することです。適切な WriteConcern (ファイア アンド フォーゲット) を使用すると、これはかなり高速になる可能性があります。ただし、これは、ネットワークを介して各レコードを PHP プロセスに取り込み、ネットワークを介してデータベースにアップロードすることを意味します。

理想的には、すべてサーバー側で行う方法が必要です。SQL の INSERT INTO ... SELECT ... のようなものです。このようにして、高速でネットワーク効率が高く、PHP の負荷が低くなります。

4

3 に答える 3

0

アップデート:

  • 古い map/reduce メソッドを削除したのは、これにより構造が変わることがわかった (そして Sammaye が指摘した) からです。
  • renameCollectionでそれを行う方法を見つけたので、実行バージョンをセカンダリにしました。

私は解決策を見つけたと信じています。一部のバージョンの PHP ドライバーは、必要がなくても管理データベースに対して認証を行うようです。ただし、authSource 接続パラメーターを使用してこの動作を変更する回避策があり、管理データベースではなく、選択したデータベースに対して認証を行います。したがって、今回の renameCollection 関数は、renameCollection コマンドのラッパーにすぎません。

重要なのは、接続時に authSource を追加することです。以下のコードでは、 $_ENV['MONGO_URI'] が接続文字列を保持し、default_database_name() が認証対象のデータベースの名前を返します。

$class = 'MongoClient'; 
if( !class_exists($class) ) $class = 'Mongo'; 
$db_server = new $class($_ENV['MONGO_URI'].'?authSource='.default_database_name());

一部の環境では eval が許可されていませんが、これも動作するはずの eval を使用した古いバージョンを次に示します ( MongoLab では、専用のシステムがない限り、セットアップが機能しません)。しかし、シャード環境で実行している場合、これは合理的な解決策のように思えます。

function renameCollection($old_name, $new_name) {
  db()->$new_name->drop();
  $copy = "function() {db.$old_name.find().forEach(function(d) {db.$new_name.insert(d)})}";
  db()->execute($copy);
  db()->$old_name->drop();
}
于 2013-07-22T17:20:06.930 に答える
-2

これを使用できます。「dropTarget」フラグが true の場合、既存のデータベースを削除します。

 $mongo = new MongoClient('_MONGODB_HOST_URL_');
    $query = array("renameCollection" => "Database.OldName", "to" => "Database.NewName", "dropTarget" => "true");

    $mongo->admin->command($query);
于 2013-12-17T16:33:12.310 に答える